一、URL Session 的基本概念
1荒给、三種工作模式:
默認(rèn)會話模式(
default
):工作模式類似于原來的NSURLConnection
,使用的是基于磁盤緩存的持久化策略办绝,使用用戶keychain中保存的證書進(jìn)行認(rèn)證授權(quán)冒黑。瞬時會話模式(
ephemeral
):該模式不使用磁盤保存任何數(shù)據(jù)。所有和會話相關(guān)的caches
嘁信,證書于样,cookies
等都被保存在RAM中,因此當(dāng)程序使會話無效潘靖,這些緩存的數(shù)據(jù)就會被自動清空穿剖。后臺會話模式(
background
):該模式在后臺完成上傳和下載,在創(chuàng)建Configuration
對象的時候需要提供一個NSString類型的ID用于標(biāo)識完成工作的后臺會話卦溢。
2糊余、NSURLSession支持的三種任務(wù)
NSURLSession類支持三種類型的任務(wù):
- 加載數(shù)據(jù):NSURLSessionDataTask
- 下載:NSURLSessionUploadTask
- 上傳:NSURLSessionDownloadTask
二、相關(guān)的類
NSURLConnection這個名字单寂,實(shí)際上指的是一組構(gòu)成Foundation框架中URL加載系統(tǒng)的相互關(guān)聯(lián)的組件:
1贬芥、NSURLRequest:請求
2、NSURLResponse:響應(yīng)
3宣决、NSURLProtocol:協(xié)議
4誓军、NSURLCache:沙盒存儲
5、NSHTTPCookieStorage:cookie存儲
6疲扎、NSURLCredentialStorage:證書存儲
7昵时、NSURLConnection:鏈接
將NSURLConnection替換為NSURLSession和NSURLSessionConfiguration捷雕。
1、NSURLSessionConfiguration 類
其中NSURLSessionConfiguration用于配置會話的屬性壹甥,可以通過該類配置會話的工作模式:
1救巷、+ (NSURLSessionConfiguration *)defaultSessionConfiguration;
2、+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration;
3句柠、+ (NSURLSessionConfiguration *)backgroundSessionConfiguration:(NSString *)identifier;
# identifier:指定了會話的ID浦译,用于標(biāo)記后臺的session。
該類的其中兩個屬性:
/* 允許請求通過蜂窩路由*/
@property BOOL allowsCellularAccess;
/* 允許后臺任務(wù)被安排在系統(tǒng)的裁量權(quán)為最佳性能 */
@property (getter=isDiscretionary) BOOL discretionary NS_AVAILABLE(NA, 7_0);
allowsCellularAccess
屬性指定是否允許使用蜂窩連接
溯职, discretionary 屬性為YES時表示當(dāng)程序在后臺運(yùn)作時由系統(tǒng)自己選擇最佳的網(wǎng)絡(luò)連接配置精盅,該屬性可以節(jié)省通過蜂窩連接的帶寬。在使用后臺傳輸數(shù)據(jù)的時候谜酒,建議使用discretionary
屬性叹俏,而不是allowsCellularAccess屬性,因?yàn)樗鼤裌iFi和電源可用性考慮在內(nèi)僻族。
補(bǔ)充:
這個標(biāo)志允許系統(tǒng)為分配任務(wù)進(jìn)行性能優(yōu)化粘驰。這意味著只有當(dāng)設(shè)備電量充足
時,設(shè)備才通過Wifi
進(jìn)行數(shù)據(jù)傳輸述么。如果電量低
蝌数,或者只僅有一個蜂窩連接
,傳輸任務(wù)是不會運(yùn)行的度秘。后臺傳輸總是在discretionary模式下運(yùn)行顶伞。
2、NSURLSession類
獲取NSURLSession類對象有3種方式:
+ (NSURLSession *)sharedSession;
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration;
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration
delegate:(id <NSURLSessionDelegate>)delegate
delegateQueue:(NSOperationQueue *)queue;
第一種方式:
是使用靜態(tài)的 sharedSession
方法剑梳,該類使用共享的會話唆貌,該會話使用全局的:Cache、Cookie阻荒、證書挠锥。
第二種方式:
通過 sessionWithConfiguration:
方法創(chuàng)建對象众羡,也就是創(chuàng)建對應(yīng)配置的會話侨赡,與NSURLSessionConfiguration合作使用。
第三種方式:
通過sessionWithConfiguration:delegate:delegateQueue
方法創(chuàng)建對象粱侣,二三兩種方式可以創(chuàng)建一個新會話并定制其會話類型羊壹。該方式中指定了session的委托和委托所處的隊(duì)列。
當(dāng)不再需要連接時齐婴,可以調(diào)用Session
的invalidateAndCancel
直接關(guān)閉油猫,或者調(diào)用finishTasksAndInvalidate
等待當(dāng)前Task結(jié)束后關(guān)閉。這時Delegate會收到URLSession:didBecomeInvalidWithError:
這個事件柠偶。Delegate收到這個事件之后會被解引用情妖。
3睬关、NSURLSessionTask類
NSURLSessionTask是一個抽象子類,它有三個子類:-
- NSURLSessionDataTask
- NSURLSessionUploadTask
- NSURLSessionDownloadTask毡证。
這三個類封裝了現(xiàn)代應(yīng)用程序的三個基本網(wǎng)絡(luò)任務(wù):獲取數(shù)據(jù)电爹,比如JSON或XML,以及上傳和下載文件料睛。
下面是其繼承關(guān)系:
有多種方法創(chuàng)建對應(yīng)的任務(wù)對象:
(1)NSURLSessionDataTask
通過request對象或url創(chuàng)建:
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request;
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url;
通過request對象或url創(chuàng)建丐箩,同時指定任務(wù)完成后通過completionHandler指定回調(diào)的代碼塊:
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler;
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url
completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler;
4、NSURLSessionDelegate和NSURLSessionTaskDelegate協(xié)議
在協(xié)議的方法中可以完成各種各樣的回調(diào)動作恤煞,如身份驗(yàn)證
屎勘、完成任務(wù)后的動作
、錯誤處理
和后臺任務(wù)完成的動作
等居扒。委托方法指定在NSURLSession中一定數(shù)量的字節(jié)傳輸使用int64_t類型的參數(shù)概漱。
# 1、這里只說下后臺任務(wù)的一個委托方法:
- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session
NS_AVAILABLE_IOS(7_0);
# 2苔货、合作使用的ApplicationDelegate方法:
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier
completionHandler:(void (^)())completionHandler NS_AVAILABLE_IOS(7_0);
將任務(wù)切換到后臺之后犀概,Session的Delegate不會再收到和Task相關(guān)的消息。當(dāng)所有Task全都完成后夜惭,程序?qū)⒈粏拘岩鲈睿⒄{(diào)用ApplicationDelegate的session 回調(diào),在這里要為后臺session(由background session的identifier標(biāo)識)指定對應(yīng)的回調(diào)代碼塊诈茧。
隨后产喉,對于每一個完成的后臺Task調(diào)用該Session的Delegate中的URLSession:downloadTask:didFinishDownloadingToURL:
(成功后)和URLSession:task:didCompleteWithError:
(成功或者失敗都會調(diào)用)方法做處理,以上的回調(diào)代碼塊可以在這里調(diào)用敢会。