iOS全解1-4:NSURLSession

一、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)用SessioninvalidateAndCancel直接關(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)系:

NSURLSessionTask繼承關(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)用敢会。


未完待續(xù)曾沈。。鸥昏。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塞俱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吏垮,更是在濱河造成了極大的恐慌障涯,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膳汪,死亡現(xiàn)場離奇詭異唯蝶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)遗嗽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門粘我,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痹换,你說我怎么就攤上這事征字《嫉” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵匙姜,是天一觀的道長缔杉。 經(jīng)常有香客問我,道長搁料,這世上最難降的妖魔是什么或详? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮郭计,結(jié)果婚禮上霸琴,老公的妹妹穿的比我還像新娘。我一直安慰自己昭伸,他們只是感情好梧乘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著庐杨,像睡著了一般选调。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灵份,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天仁堪,我揣著相機(jī)與錄音,去河邊找鬼填渠。 笑死弦聂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的氛什。 我是一名探鬼主播莺葫,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼枪眉!你這毒婦竟也來了捺檬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贸铜,失蹤者是張志新(化名)和其女友劉穎堡纬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萨脑,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隐轩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年饺饭,在試婚紗的時候發(fā)現(xiàn)自己被綠了渤早。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘫俊,死狀恐怖鹊杖,靈堂內(nèi)的尸體忽然破棺而出悴灵,到底是詐尸還是另有隱情,我是刑警寧澤骂蓖,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布积瞒,位于F島的核電站,受9級特大地震影響登下,放射性物質(zhì)發(fā)生泄漏茫孔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一被芳、第九天 我趴在偏房一處隱蔽的房頂上張望缰贝。 院中可真熱鬧,春花似錦畔濒、人聲如沸剩晴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赞弥。三九已至,卻和暖如春趣兄,著一層夾襖步出監(jiān)牢的瞬間绽左,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工艇潭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妇菱,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓暴区,卻偏偏與公主長得像闯团,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仙粱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容