玩轉 iOS 開發:NSURLSession 講解 (一)

文章分享至個人我的技術博客: https://cainluo.github.io/14980521480137.htmlhtml


NSURLSession

在2013年的時候, 蘋果推出了iOS 7, 這個版本的iOS被稱爲革命性的iOS, 而咱們之前所用到的NSURLConnection這個網絡庫也被蘋果爸爸給重構, 而且從新命名爲NSURLSession.git

如今在GitHub裏用的最多的兩個庫AFNetworking, SDWebImage都是用了NSURLSession.github

這裏就不廢話了, 直接來知識點吧.緩存


網絡通訊

關於Session的意思, 我這裏找到一段比較古方的解釋:服務器

Session翻譯爲中文意思是會話,咱們知道,在七層網絡協議中有物理層->數據鏈路層->網絡層->傳輸層->會話層->表示層->應用層,那咱們能夠將NSURLSession類理解爲會話層,用於管理網絡接口的建立、維護、刪除等等工做,咱們要作的工做也只是會話層以後的層便可,底層的工做NSURLSession已經幫咱們封裝好了.微信

看到這咱們就很激動, 由於底層的東西不須要咱們去管理, 這就輕鬆多了.cookie


NSURLSession的分支

咱們都知道蘋果爸爸用NSURLSession代替了NSURLConnection, 那麼NSURLSession裏面到底有什麼呢?網絡

NSURLSession父類:session

  • NSURLSession
  • NSURLSessionConfiguration

NSURLSessionTask子類:app

  • NSURLSessionDataTask
  • NSURLSessionUploadTask
  • NSURLSessionDownloadTask
  • NSURLSessionStreamTask (iOS 9後才支持)

他們的主要關係:

1

NSURLSessionTask子類的繼承關係:

2

NSURLSessionDataTask: 主要使用在請求一些比較簡單的數據, 好比咱們經常使用的JSON數據.

NSURLSessionDownloadTask: 這個主要使用在進行一些文件的下載, 它能夠針對一些大文件的網絡請求作更多的處理, 好比獲取下載進度, 文件的斷點續傳等等牛逼事情.

NSURLSessionUploadTask: 這個和上面那個task對應, 主要是給服務器發送文件數據所使用的.

NSURLSessionStreamTask: 提供TCP/IP的一個連接入口, 方便進行傳輸.


使用NSURLSession

不要覺得看完了上面就能夠直接拿來和服務器交互了啦, 由於NSURLSession自己是不會進行請求, 須要經過建立對應的task, 而後配置完以後, 再去調用resume()方法纔可以進行tongxin.

這裏有一個好消息就是贊成個NSURLSession是能夠建立多個task, 而且這些taskcachecookie都是共享的.

使用NSURLSession的步驟:

  1. 建立NSURLSession對象
  2. 使用NSURLSession建立對應的task
  3. 最後一步就是調用resume()方法, 開始請求.

建立NSURLSession對象有三種方法, 這裏就不建立工程裏, 直接貼代碼吧:

第一種:

// 獲取一個共享的單例會話對象
    NSURLSession *urlSession = [NSURLSession sharedSession];
複製代碼

第二種:

// 用NSURLSessionConfiguration獲取一個特定的NSURLSession
NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:<#(nonnull NSURLSessionConfiguration *)#>];
複製代碼

第三種:

// 用NSURLSessionConfiguration獲取一個特定的NSURLSession, 而且設置好代理對象, 和代理的隊列
    NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:<#(nonnull NSURLSessionConfiguration *)#>
                                                             delegate:<#(nullable id<NSURLSessionDelegate>)#>
                                                        delegateQueue:<#(nullable NSOperationQueue *)#>]

複製代碼

配置NSURLSession

剛剛咱們也提到, NSURLSession是無法直接進行請求的, 因此咱們須要去配置一下, 這裏也有三種配置的方法.

第一種:

// NSURLSessionConfiguration的默認配置, 這種配置會把緩存數據存儲到磁盤上
@property (class, readonly, strong) NSURLSessionConfiguration *defaultSessionConfiguration;

NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
複製代碼

第二種:

// NSURLSessionConfiguration的第二種配置, 這種配置不會把數據持久化, 也就是說不會存儲到磁盤上
@property (class, readonly, strong) NSURLSessionConfiguration *ephemeralSessionConfiguration;

NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration ephemeralSessionConfiguration]];
複製代碼

第三種:

// 這個配置能夠容許程序在後臺進行上傳和下載的操做, 給定一個Identifier能夠在系統關閉應用以後重啓, 根據給定的`Identifier`終止正在下載或者上傳操做, 但若是是用戶手動關閉了應用, 系統就會取消全部後臺傳輸的會話, 官方建議, 若是要時候後臺操做的話, 把discretionary屬性設置成爲YES, 能夠得到更好地性能.
+ (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier NS_AVAILABLE(10_10, 8_0);

NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"backgroundSessionConfiguration"]];
複製代碼

使用NSURLSession建立Task

剛剛咱們也說了, NSURLSession是有三個子類的Task, 因此這裏咱們也要分開來講說.

NSURLSessionDataTask:

// 經過指定的NSURL來建立一個NSURLSessionDataTask
NSURLSessionDataTask *dataTask = [urlSession dataTaskWithURL:[NSURL URLWithString:@""]];

// 經過指定的NSURL對象來建立, 並同時執行完對應的任務後經過completionHandler:返回NSURLSessionDataTask
NSURLSessionDataTask *dataTask = [urlSession dataTaskWithURL:[NSURL URLWithString:@""]
                                           completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
                                           }];

// 經過指定的NSURLRequest對象來建立一個NSURLSessionDataTask
NSURLSessionDataTask *dataTask = [urlSession dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]]];

// 經過指定的NSURLRequest對象來建立, 並同時執行完對應的任務後經過completionHandler:返回NSURLSessionDataTask
NSURLSessionDataTask *dataTask = [urlSession dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]]
                                               completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
                                                   }];
複製代碼

-- NSURLSessionUploadTask:

// 經過指定的NSURLRequest對象來建立一個NSURLSessionUploadTask
NSURLSessionUploadTask *uploadTask = [urlSession uploadTaskWithStreamedRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]]];

// 經過指定的NSURLRequest對象來建立一個NSURLSessionUploadTask, 而且指定上傳時所需的數據源
NSURLSessionUploadTask *uploadTask = [urlSession uploadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]]
                                                              fromData:[NSData data]];

// 經過指定的NSURLRequest對象來建立一個NSURLSessionUploadTask, 而且指定上傳時所需的文件源
NSURLSessionUploadTask *uploadTask = [urlSession uploadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]]
                                                              fromFile:[NSURL URLWithString:@""]];

// 經過指定的NSURLRequest對象來建立, 指定上傳時所需的文件源, 而且同時執行完對應的任務後經過completionHandler:來返回NSURLSessionUploadTask
NSURLSessionUploadTask *uploadTask = [urlSession uploadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]]
                                                              fromFile:[NSURL URLWithString:@""]
                                                     completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
                                                     }];

// 經過指定的NSURLRequest對象來建立, 指定上傳時所需的數據源, 而且同時執行完對應的任務後經過completionHandler:來返回NSURLSessionUploadTask
NSURLSessionUploadTask *uploadTask = [urlSession uploadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]]
                                                              fromData:[NSData data]
                                                     completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
                                                     }];
複製代碼

-- NSURLSessionDownloadTask:

// 經過指定的NSURL對象來建立一個NSURLSessionDownloadTask
NSURLSessionDownloadTask *downloadTask = [urlSession downloadTaskWithURL:[NSURL URLWithString:@""]];

// 經過指定的NSURL對象來建立一個NSURLSessionDownloadTask, 並同時執行完對應的任務後經過completionHandler:返回NSURLSessionDownloadTask
NSURLSessionDownloadTask *downloadTask = [urlSession downloadTaskWithURL:[NSURL URLWithString:@""]
                                                       completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {    
                                                       }];

// 經過指定的NSURLRequest對象來建立一個NSURLSessionDownloadTask
NSURLSessionDownloadTask *downloadTask = [urlSession downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]]];

// 經過指定的NSURLRequest對象來建立一個NSURLSessionDownloadTask, 並同時執行完對應的任務後經過completionHandler:返回NSURLSessionDownloadTask
NSURLSessionDownloadTask *downloadTask = [urlSession downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]]
                                                           completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {                                                             
                                                           }];

// 經過指定的NSData對象來建立一個NSURLSessionDownloadTask, 這個NSData對象是以前下載失敗或者是中止下載了的數據, 這就是咱們常說的斷點續傳
NSURLSessionDownloadTask *downloadTask = [urlSession downloadTaskWithResumeData:[NSData data]];

// 經過指定的NSData對象來建立一個NSURLSessionDownloadTask, , 並同時執行完對應的任務後經過completionHandler:返回NSURLSessionDownloadTask, 同時也是支持斷點續傳
NSURLSessionDownloadTask *downloadTask = [urlSession downloadTaskWithResumeData:[NSData data]
                                                              completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
                                                              }];
複製代碼

NSURLSessionStreamTask:

// 經過一個指定的NSNetService對象來建立NSURLSessionStreamTask
NSURLSessionStreamTask *streamTask = [urlSession streamTaskWithNetService:[[NSNetService alloc] init]];

// 經過一個指定的IP地址, 端口號來建立一個NSURLSessionStreamTask
NSURLSessionStreamTask *streamTask = [urlSession streamTaskWithHostName:@"192.168.1.1"
                                                                   port:8888];
複製代碼

NSURLSessionDelegate

剛剛講完了三種Task, 這裏補充一下, 就是說咱們不管會用哪種Task, 咱們均可以指定對應的代理, 這裏有一張NSURLSession代理關係圖:

3

代理類 做用
NSURLSessionDelegate 做爲其餘代理的最基類, 定義了最基礎的網絡請求代理方法
NSURLSessionTaskDelegate 定義了網絡請求任務的代理方法
NSURLSessionDownloadDelegate 定義了下載任務的代理方法, 好比獲取下載進度
NSURLSessionDataDelegate 定義了上傳任務或普通數據任務的代理方法
NSURLSessionStreamDelegate 這個代理方法是繼承於NSURLSessionTaskDelegate, 提供一個TCP/IP的連接代理方法.

詳細你們都會用代理方法, 這裏就不介紹了.


執行任務

剛剛說完了那麼多東西, 最後就差執行任務了:

[task resume];
複製代碼

醬紫就完事啦, 若是還想了解更多的話, 能夠去看看蘋果爸爸的官方文檔.


工程地址

項目地址: https://github.com/CainRun/iOS-10-Characteristic/tree/master/10.Siri%20Intents%20UI


最後

碼字很費腦, 看官賞點飯錢可好

微信

支付寶
相關文章
相關標籤/搜索