NSURLSession


簡(jiǎn)介:

  • 用于替代NSURLConnection
  • 支持后臺(tái)運(yùn)行的網(wǎng)絡(luò)任務(wù)
  • 暫停、停止、重啟網(wǎng)絡(luò)任務(wù),不再需要NSOperation封裝
  • 請(qǐng)求可以使用同樣的配置容器
  • 直接使用系統(tǒng)方法可以實(shí)現(xiàn)文件上傳和下載
  • 通過(guò)代理方法可以獲取文件上傳和下載的進(jìn)度
  • block 和代理都對(duì)文件上傳和下載起作用
  • 當(dāng)文件上傳時(shí),block和代理可以同時(shí)使用
  • 當(dāng)文件下載時(shí),block和代理不要同時(shí)使用

說(shuō)明

為了方便程序員使用,蘋果提供了一個(gè)全局 session.
所有的 任務(wù)(Task) 都是由 session 發(fā)起的.
所有的任務(wù)默認(rèn)是掛起的,需要 resume.
session可以自定義,自定義的時(shí)候可以同時(shí)設(shè)置代理.


結(jié)構(gòu)圖

使用NSURLSession發(fā)送GET請(qǐng)求

- (void)sendRequest
{
    // 1.URL
    NSURL *URL = [NSURL URLWithString:@"http://localhost/demo.json"];

    // 2.session
    NSURLSession *session = [NSURLSession sharedSession];

    // 3.發(fā)起任務(wù)(Task)
    // 請(qǐng)求默認(rèn)是GET的.所以不需要?jiǎng)?chuàng)建request.
    // completionHandler : 服務(wù)器把數(shù)據(jù)返回到客戶端之后,會(huì)自動(dòng)調(diào)用的
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:URL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        // 5.處理響應(yīng)
        if (error==nil && data!=nil && data.length>0) {

            // 反序列化
            id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
            NSLog(@"%@",result);

        } else {
            NSLog(@"出錯(cuò) %@",error);
        }
    }];

    // 4.啟動(dòng)任務(wù)(resume)
    [dataTask resume];
}
  • 如果不想自己創(chuàng)建session,可以直接使用蘋果提供的單例session;
    一般在要使用session的代理方法或者需要設(shè)置session的Configuration時(shí)會(huì)自定義session.
  • 任務(wù)(task)是不需要新建的,直接由session發(fā)起.
    普通的獲取數(shù)據(jù)的任務(wù)指定為NSURLSessionDataTask.
  • 任務(wù)默認(rèn)是掛起的,需要手動(dòng)開啟任務(wù).
    NSURLSession的網(wǎng)絡(luò)請(qǐng)求默認(rèn)是GET.

使用NSURLSession發(fā)送POST請(qǐng)求

- (void)loadData
{
    // 1.URL
    NSURL *URL = [NSURL URLWithString:@"http://localhost/php/login/login.php"];

    // 2.request
    NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:URL];
    // 設(shè)置請(qǐng)求方法
    requestM.HTTPMethod = @"POST";
    // 設(shè)置請(qǐng)求體
    NSString *body = @"username=zhangsan&password=zhang";
    requestM.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];

    // 3.session
    NSURLSession *session = [NSURLSession sharedSession];

    // 4.發(fā)起任務(wù)(task)
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:requestM completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        // 6.處理響應(yīng)
        if (error==nil && data!=nil && data.length>0) {

            // 反序列化
            id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
            NSLog(@"%@",result);

        } else {
            NSLog(@"出錯(cuò) %@",error);
        }
    }];

    // 5.啟動(dòng)任務(wù)(resume)
    [dataTask resume];
}
  • NSURLSession實(shí)現(xiàn)POST請(qǐng)求,需要?jiǎng)?chuàng)建可變請(qǐng)求對(duì)象,用于設(shè)置請(qǐng)求方法和請(qǐng)求體.
  • POST請(qǐng)求也是屬于普通的獲取數(shù)據(jù)的任務(wù).所以任務(wù)也是指定為NSURLSessionDataTask.

NSURLSession文件下載的代理工作隊(duì)列

  • nil - 異步回調(diào) 和 實(shí)例化一個(gè) 操作隊(duì)列的效果是一樣的!

  • [[NSOperationQueue alloc] init] - 子線程中執(zhí)行代理方法

注意:下載本身的線程"只有一條".
代理回調(diào)可以在"多個(gè)線程"回調(diào)!

  • [NSOperationQueue mainQueue] - 主線程中執(zhí)行代理方法

下載本身是異步執(zhí)行的,這一點(diǎn)和 NSURLConnection 是一樣的.
指定代理執(zhí)行的隊(duì)列,不會(huì)影響到下載本身的執(zhí)行.
NSURLSession 即使在主線程回調(diào)也不會(huì)造成阻塞.
如何選擇隊(duì)列

網(wǎng)絡(luò)訪問(wèn)結(jié)束后,如果不需要做復(fù)雜的操作,可以指定主隊(duì)列,這樣不用考慮線程間通訊.

使用NSURLSessionDownloadDelegate時(shí),回調(diào)和代理方法不能同時(shí)使用,一旦同時(shí)使用,代理方法就不再執(zhí)行。
文件下載之后,會(huì)默認(rèn)的被刪除,所以文件下載接收后需要自己實(shí)現(xiàn)緩存。

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

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

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