iOS中的NSURLSession

在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)系:


關(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)

開發(fā)只懂 AFN ?搞定 NSURLSession 才是硬道理

NSURLSession 教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容