在iOS開發(fā)中,尤其到了iOS9之后,蘋果放棄了NSURLConnection,因此開發(fā)網(wǎng)絡功能的時候一般都用NSURLSession或者是AFNetworking第三方庫。不過AFNetworking也是基于NSURLSession來開發(fā)的,因此有必要知道NSURLSession的用法。
首先看看NSURLSession的優(yōu)點吧。
NSURLSession 支持 http2.0 協(xié)議;
在處理下載任務的時候可以直接把數(shù)據(jù)下載到磁盤;
后臺上傳和下載;
同一個 session 發(fā)送多個請求,只需要建立一次連接(復用了TCP);
提供了全局的 session 并且可以統(tǒng)一配置,使用更加方便;
下載的時候是多線程異步處理,效率更高;
NSURLSession在使用上需要先根據(jù)會話對象創(chuàng)建一個請求Task,然后執(zhí)行該Task就可以了。
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:weiboURL] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
{
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"數(shù)據(jù):%@",string);
}] resume];
這樣就能請求到數(shù)據(jù)了。
這里還有對應的Task類,是NSURLSessionTask。不過NSURLSessionTask是抽象類,我們需要使用它的子類,先看看關(guān)系:

在使用時,需要根據(jù)具體需求來使用對應的子類。
在網(wǎng)絡中,我們經(jīng)常用到的功能是get和post請求。如果用NSURLSession怎么來做?
首先是發(fā)送get請求:
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:weiboURL]
completionHandler:^(NSData * _Nullable data,
NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"數(shù)據(jù):%@",string);
}];
[task resume];
和上面一樣,其實dataTaskWithURL:方法就是返回一個Task對象。
接下來是post請求:
NSURLSession *session = [NSURLSession sharedSession];
//創(chuàng)建可變的請求對象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//修改為post請求
request.HTTPMethod = @"POST";
//設置消息體,參數(shù)
request.HTTPBody = [@"containerid=100505_-_WEIBO_SECOND_PROFILE_WEIBO&count=10" dataUsingEncoding:NSUTF8StringEncoding];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:
^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
{
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@",dict);
}];
[dataTask resume];
其實不用改HTTPMethod的話就是默認get請求,這也是get請求一種方法;改為post后就是post請求了,HTTPBody中放要傳過去的參數(shù)。
我們看NSURLSession中還有個代理,這個代理的作用是我們可以通過它來監(jiān)聽到網(wǎng)絡請求的過程,如下載文件需監(jiān)聽文件下載進度等。
//創(chuàng)建可變的請求對象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:weiboURL]];
//修改為post請求
request.HTTPMethod = @"POST";
//設置消息體
request.HTTPBody = [@"containerid=100505_-_WEIBO_SECOND_PROFILE_WEIBO&count=10" dataUsingEncoding:NSUTF8StringEncoding];
NSURLSession *session2 = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
NSURLSessionDataTask *dataTask = [session2 dataTaskWithRequest:request];
[dataTask resume];
代理如下:
-(void)URLSession:(NSURLSession *)session
dataTask:(nonnull NSURLSessionDataTask *)dataTaskdidReceiveResponse:(nonnull NSURLResponse *)responsecompletionHandler:(nonnull void (^)(NSURLSessionResponseDisposition))completionHandler
{
//子線程中執(zhí)行
NSLog(@"接收到服務器響應的時候調(diào)用 -- %@", [NSThread currentThread]);
//self.data = [NSMutableData data];
//默認情況下不接收數(shù)據(jù)
//必須告訴系統(tǒng)是否接收服務器返回的數(shù)據(jù)
completionHandler(NSURLSessionResponseAllow);
}
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
NSLog(@"接受到服務器返回數(shù)據(jù)的時候調(diào)用,可能被調(diào)用多次");
//拼接服務器返回的數(shù)據(jù)
//[self.dataM appendData:data];
}
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"請求完成或者是失敗的時候調(diào)用");
//解析服務器返回數(shù)據(jù)
// NSLog(@"%@", [[NSString alloc] initWithData:self.dataM encoding:NSUTF8StringEncoding]);
}

在上面進行代理設置的時候,我們用了session的另一個初始化方法,里面?zhèn)鞯膮?shù)中有一個是NSURLSessionConfiguration。
那么什么是NSURLSessionConfiguration呢?看名字是關(guān)于配置的。因此,NSURLSessionConfiguration可以為NSURLSession配置一些請求所需要的策略。如:超時、緩存策略、鏈接需求等。
有三個方法用來創(chuàng)建NSURLSessionConfiguration:
defaultSessionConfiguration:使用全局的cache,cookie和credential storage objects來創(chuàng)建configuration對象。
ephemeralSessionConfiguration:這個configuration用于“private” sessions,還有對于cache, cookie, or credential storage objects的非永久存儲。
backgroundSessionConfiguration:做遠程push通知或是應用程序掛起的時候就要用到這個configuration。
一旦創(chuàng)建了NSURLSessionConfiguration就可以給它設置各種屬性了:
NSURLSessionConfiguration *sessionConfig =[NSURLSessionConfiguration defaultSessionConfiguration];
// 1
sessionConfig.allowsCellularAccess = NO;
// 2
[sessionConfig setHTTPAdditionalHeaders: @{@"Accept": @"application/json"}];
// 3
sessionConfig.timeoutIntervalForRequest = 30.0;
sessionConfig.timeoutIntervalForResource = 60.0;
sessionConfig.HTTPMaximumConnectionsPerHost = 1;
這里設置了限制網(wǎng)絡只能是wifi;所有的請求只接收JSON數(shù)據(jù);配置網(wǎng)絡超時,限制一個主機只有一個網(wǎng)絡連接。
這就記錄了些NSURLSession的簡單用法,參考的是下面的文章,里面還有些別的東西,就先放著這里了:
iOS開發(fā)網(wǎng)絡篇—發(fā)送GET和POST請求(使用NSURLSession)