文章分享至個人我的技術博客: https://cainluo.github.io/14980521480137.htmlhtml
在2013年的時候, 蘋果推出了iOS 7
, 這個版本的iOS
被稱爲革命性的iOS
, 而咱們之前所用到的NSURLConnection
這個網絡庫也被蘋果爸爸給重構, 而且從新命名爲NSURLSession
.git
如今在GitHub
裏用的最多的兩個庫AFNetworking, SDWebImage都是用了NSURLSession
.github
這裏就不廢話了, 直接來知識點吧.緩存
關於Session
的意思, 我這裏找到一段比較古方的解釋:服務器
Session
翻譯爲中文意思是會話,咱們知道,在七層網絡協議中有物理層->數據鏈路層->網絡層->傳輸層->會話層->表示層->應用層
,那咱們能夠將NSURLSession
類理解爲會話層,用於管理網絡接口的建立、維護、刪除等等工做,咱們要作的工做也只是會話層以後的層便可,底層的工做NSURLSession
已經幫咱們封裝好了.微信
看到這咱們就很激動, 由於底層的東西不須要咱們去管理, 這就輕鬆多了.cookie
咱們都知道蘋果爸爸用NSURLSession
代替了NSURLConnection
, 那麼NSURLSession
裏面到底有什麼呢?網絡
NSURLSession
父類:session
NSURLSessionTask
子類:app
他們的主要關係:
NSURLSessionTask
子類的繼承關係:
NSURLSessionDataTask
: 主要使用在請求一些比較簡單的數據, 好比咱們經常使用的JSON
數據.
NSURLSessionDownloadTask
: 這個主要使用在進行一些文件的下載, 它能夠針對一些大文件的網絡請求作更多的處理, 好比獲取下載進度, 文件的斷點續傳等等牛逼事情.
NSURLSessionUploadTask
: 這個和上面那個task
對應, 主要是給服務器發送文件數據所使用的.
NSURLSessionStreamTask
: 提供TCP/IP
的一個連接入口, 方便進行傳輸.
不要覺得看完了上面就能夠直接拿來和服務器交互了啦, 由於NSURLSession
自己是不會進行請求, 須要經過建立對應的task
, 而後配置完以後, 再去調用resume()
方法纔可以進行tongxin.
這裏有一個好消息就是贊成個NSURLSession
是能夠建立多個task
, 而且這些task
的cache
和cookie
都是共享的.
使用NSURLSession
的步驟:
NSURLSession
對象NSURLSession
建立對應的task
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
是無法直接進行請求的, 因此咱們須要去配置一下, 這裏也有三種配置的方法.
第一種:
// 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
, 因此這裏咱們也要分開來講說.
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];
複製代碼
剛剛講完了三種Task
, 這裏補充一下, 就是說咱們不管會用哪種Task
, 咱們均可以指定對應的代理, 這裏有一張NSURLSession
代理關係圖:
代理類 | 做用 |
---|---|
NSURLSessionDelegate | 做爲其餘代理的最基類, 定義了最基礎的網絡請求代理方法 |
NSURLSessionTaskDelegate | 定義了網絡請求任務的代理方法 |
NSURLSessionDownloadDelegate | 定義了下載任務的代理方法, 好比獲取下載進度 |
NSURLSessionDataDelegate | 定義了上傳任務或普通數據任務的代理方法 |
NSURLSessionStreamDelegate | 這個代理方法是繼承於NSURLSessionTaskDelegate , 提供一個TCP/IP的連接代理方法. |
詳細你們都會用代理方法, 這裏就不介紹了.
剛剛說完了那麼多東西, 最後就差執行任務了:
[task resume];
複製代碼
醬紫就完事啦, 若是還想了解更多的話, 能夠去看看蘋果爸爸的官方文檔.
項目地址: https://github.com/CainRun/iOS-10-Characteristic/tree/master/10.Siri%20Intents%20UI