概述
NSURLSession
類(lèi)和其相關(guān)的類(lèi)提供了下載內(nèi)容的API.此類(lèi)提供了豐富的代理方法集合以支持驗(yàn)證并且在應(yīng)用沒(méi)有運(yùn)行時(shí)像鸡,或者在iOS中處于掛起狀態(tài)時(shí)猪杭,也能夠在后臺(tái)下載墓律。
NSURLSession
類(lèi)原生支持data
赫粥,file
谎亩,ftp
梢薪,http
和https
蹬铺。
使用NSURLSession
API,應(yīng)用可能創(chuàng)建一個(gè)或者多個(gè)sessions
,每一個(gè)session
協(xié)調(diào)一組相關(guān)的數(shù)據(jù)傳輸任務(wù)。比如秉撇,寫(xiě)一個(gè)web
瀏覽器丛塌,應(yīng)用可能為每一個(gè)標(biāo)簽頁(yè)或者窗口創(chuàng)建一個(gè)session
,或者為交互中的用戶創(chuàng)建一個(gè)session
并為后臺(tái)下載創(chuàng)建另一個(gè)session
畜疾。在每一個(gè)session中應(yīng)用為其添加一系列的任務(wù)赴邻,每一個(gè)任務(wù)代表一個(gè)指定URL請(qǐng)求。
一個(gè)URLSession中的任務(wù)共享一個(gè)配置對(duì)象啡捶,配置對(duì)象定義了連接行為姥敛,比如同時(shí)連接到同一個(gè)服務(wù)器的最大連接數(shù)量,是否允許蜂窩網(wǎng)絡(luò)連接瞎暑,等等彤敛。會(huì)話的行為部分由創(chuàng)建其配置對(duì)象時(shí)調(diào)用的方法決定:
單例共享的
session
(沒(méi)有配置對(duì)象)用于創(chuàng)建基本的請(qǐng)求。它不能夠自定義了赌。但是如果是非常局限的請(qǐng)求墨榄,使用它是個(gè)非常不錯(cuò)的開(kāi)始。調(diào)用sharedSession
訪問(wèn)這個(gè)session勿她。有關(guān)其限制的更多信息袄秩,請(qǐng)參閱該方法的討論。臨時(shí)會(huì)話與默認(rèn)會(huì)話類(lèi)似,但不要將緩存之剧,
Cookie
或憑據(jù)寫(xiě)入磁盤(pán)郭卫。 您可以通過(guò)調(diào)用NSURLSessionConfiguration
類(lèi)中的ephemeralSessionConfiguration
方法來(lái)創(chuàng)建臨時(shí)會(huì)話配置。后臺(tái)會(huì)話允許應(yīng)用在未運(yùn)行時(shí)在后臺(tái)執(zhí)行內(nèi)容的上傳和下載背稼。 您可以通過(guò)調(diào)用
NSURLSessionConfiguration
類(lèi)中的backgroundSessionConfiguration:
方法來(lái)創(chuàng)建后臺(tái)會(huì)話配置贰军。NSURLSession
類(lèi)和其相關(guān)的類(lèi)提供了下載內(nèi)容的API.此類(lèi)提供了豐富的代理方法集合以支持驗(yàn)證并且在應(yīng)用沒(méi)有運(yùn)行時(shí),或者在iOS中處于掛起狀態(tài)時(shí)蟹肘,也能夠在后臺(tái)下載词疼。
session
配置對(duì)象同時(shí)包含URL緩存和Cookie存儲(chǔ)對(duì)象的引用,這些引用在創(chuàng)建請(qǐng)求或者處理響應(yīng)時(shí)可能會(huì)用到帘腹,取決于配置和請(qǐng)求類(lèi)型寒跳。
session
的任務(wù)也共享一個(gè)代理,允許你在認(rèn)證失敗竹椒,當(dāng)數(shù)據(jù)從服務(wù)器返回,當(dāng)準(zhǔn)備緩存數(shù)據(jù)等多個(gè)事件發(fā)生時(shí)提供和獲取信息米辐。對(duì)于所有后臺(tái)下載和上傳胸完,必須提供一個(gè)遵循了NSURLSessionDownloadDelegate
協(xié)議的代理。另外如果不需要代理提供的任何功能翘贮,可以在創(chuàng)建session時(shí)傳入nil赊窥,也就是不提供其代理對(duì)象。
重要
session對(duì)象對(duì)代理是強(qiáng)引用直到應(yīng)用退出或者顯式地銷(xiāo)毀session狸页。如果不銷(xiāo)毀session锨能,在應(yīng)用未退出前會(huì)一直泄漏內(nèi)存。
在session中創(chuàng)建任務(wù)以上傳數(shù)據(jù)到服務(wù)器芍耘,然后從服務(wù)器獲取數(shù)據(jù)轉(zhuǎn)換為文件放在磁盤(pán)或者轉(zhuǎn)換為NSData存放在內(nèi)存中址遇。NSURLSession
提供了三種任務(wù)類(lèi)型:
NSURLSessionDataTask
使用NSData發(fā)送和接收數(shù)據(jù)。通常用在與服務(wù)器耗時(shí)較短的斋竞、交互的(自己的理解與后臺(tái)相對(duì)倔约,不在后臺(tái)運(yùn)行)請(qǐng)求。NSURLSessionUploadTask
和NSURLSessionDataTask
相似坝初,也發(fā)送數(shù)據(jù)(通常以文件形式)浸剩,支持在應(yīng)用未運(yùn)行的情況下在后臺(tái)上傳。NSURLSessionDownloadTask
以文件的形式獲取數(shù)據(jù)鳄袍,支持在應(yīng)用未運(yùn)行的情況下在后臺(tái)下載和上傳绢要。
和大多數(shù)網(wǎng)絡(luò)API一樣,NSURLSession
API是異步的拗小。它以兩種方式中的一種返回?cái)?shù)據(jù)重罪,基于調(diào)用的方法:
- 當(dāng)傳輸成功或者失敗時(shí),調(diào)用完成處理代碼塊(completion handler block);
- 當(dāng)傳輸完成蛆封,數(shù)據(jù)到達(dá)時(shí)調(diào)用
session
的代理方法唇礁。
向代理分發(fā)信息之外,NSURLSession
API提供狀態(tài)和進(jìn)度屬性惨篱。如果需要可以查詢它們盏筐,根據(jù)當(dāng)前的任務(wù)狀態(tài)做程序決議。
URL session
同時(shí)支持取消砸讳、重啟琢融、恢復(fù)和掛起任務(wù),并能夠在掛起簿寂、取消漾抬、下載失敗的位置恢復(fù)任務(wù)。
URL Session類(lèi)層級(jí)
NSURLSession
API包含以下類(lèi):
- NSURLSession - 會(huì)話對(duì)象
- NSURLSessionConfiguration - 初始化
session
對(duì)象時(shí)用到的配置對(duì)象 - NSURLSessionTask - 會(huì)話中任務(wù)的基類(lèi)
- NSURLSessionDataTask - 獲取URL內(nèi)容的任務(wù)常遂,獲取的數(shù)據(jù)轉(zhuǎn)換為NSData對(duì)象
- NSURLSessionUploadTask - 上傳文件的任務(wù)纳令,然后從URL獲取內(nèi)容,獲取的數(shù)據(jù)轉(zhuǎn)換為NSData對(duì)象
- NSURLSessionDownloadTask - 從URL獲取內(nèi)容的任務(wù)克胳,獲取的內(nèi)容轉(zhuǎn)換為磁盤(pán)上的臨時(shí)文件平绩。
- NSURLSessionStreamTask - 創(chuàng)建TCP/IP連接的任務(wù)
- NSURLSessionDataTask - 獲取URL內(nèi)容的任務(wù)常遂,獲取的數(shù)據(jù)轉(zhuǎn)換為NSData對(duì)象
另外,NSURLSession
API提供了四個(gè)協(xié)議漠另,應(yīng)用可以實(shí)現(xiàn)這些協(xié)議定義的代理方法捏雌,從而對(duì) `session和任務(wù)行為提供更細(xì)粒度的控制。
- NSURLSessionDelegate - 定義代理方法以處理會(huì)話級(jí)事件
- NSURLSessionTaskDelegate - 處理所有任務(wù)類(lèi)型通用的任務(wù)級(jí)事件
- NSURLSessionDataDelegate - 定義委托方法來(lái)處理特定于數(shù)據(jù)和上傳任務(wù)的任務(wù)級(jí)事件
- NSURLSessionDownloadDelegate - 定義委托方法以處理特定于下載任務(wù)的任務(wù)級(jí)事件
- NSURLSessionStreamDelegate - 定義委托方法以處理特定于'stream'任務(wù)的任務(wù)級(jí)事件
最后笆搓,NSURLSession也使用其他常用的類(lèi)性湿,比如NSURLConnection
和NSURLDownload
。其中一些共享類(lèi)如下:
- NSURL - 包含URL的對(duì)象
- NSURLRequest - 封裝與URL請(qǐng)求向關(guān)聯(lián)的元數(shù)據(jù)满败,包括URL,請(qǐng)求方法肤频,等等。
- NSURLResponse - 封裝與服務(wù)器響應(yīng)對(duì)象相關(guān)的元數(shù)據(jù)算墨,比如內(nèi)容的MIME類(lèi)型和長(zhǎng)度着裹。
- NSHTTPURLResponse - HTTP請(qǐng)求相關(guān)的特指的額外的元數(shù)據(jù),比如響應(yīng)頭
- NSCachedURLReponse - 封裝NSURLResponse對(duì)象以及服務(wù)器響應(yīng)的實(shí)際主體數(shù)據(jù)米同,用于緩存目的骇扇。
驗(yàn)證和TLS自定義
當(dāng)服務(wù)器請(qǐng)求身份驗(yàn)證或在TLS協(xié)商期間提供憑據(jù)時(shí),URL會(huì)話將調(diào)用其代理上的方法面粮,以允許以自定義方式處理身份驗(yàn)證或證書(shū)驗(yàn)證少孝。 它調(diào)用的方法取決于您是處理任務(wù)特定的挑戰(zhàn)(task-specific challenge)還是會(huì)話范圍的挑戰(zhàn)(session-wide challenge)。 表1顯示了兩者之間的差異熬苍。
對(duì)于任務(wù)特定的挑戰(zhàn)稍走,會(huì)話調(diào)用它代理的URLSession:task:didReceiveChallenge:completionHandler:
方法袁翁。
對(duì)于會(huì)話范圍的驗(yàn)證挑戰(zhàn),會(huì)話調(diào)用它代理的URLSession:didReceiveChallenge:completionHandler:
方法婿脸,如果有這個(gè)方法粱胜。否則,調(diào)用它代理的URLSession:task:didReceiveChallenge:completionHandler:
方法狐树。
如果不實(shí)現(xiàn)這些方法焙压,當(dāng)一個(gè)請(qǐng)求需要客戶端驗(yàn)證時(shí),URL嘗試驗(yàn)證如下:
使用提供的身份驗(yàn)證信息作為請(qǐng)求的URL的一部分抑钟,如果可用通過(guò)在用戶的鑰匙串(在macOS中)或應(yīng)用程序的鑰匙串(在iOS中)查找Internet密碼和證書(shū)涯曲,
然后,如果憑據(jù)不可用在塔,或者服務(wù)器拒絕憑據(jù)幻件,連接將繼續(xù)進(jìn)行而不進(jìn)行身份驗(yàn)證。 對(duì)于HTTP和HTTPS請(qǐng)求蛔溃,連接嘗試失敗绰沥,并給出相應(yīng)的HTTP狀態(tài)代碼,并可能提供可選的內(nèi)容(例如私有站點(diǎn)的公開(kāi)版本)贺待。 對(duì)于其他URL類(lèi)型(如FTP)徽曲,返回連接失敗的結(jié)果。
** 注意 **
Kerberos認(rèn)證是透明處理的狠持。 這里描述的委托方法不適用于Kerberos身份驗(yàn)證。
應(yīng)用傳輸安全(App Transport Security, ATS)
從iOS 9.0和OS X v10.11開(kāi)始瞻润,對(duì)于使用NSURLSession所做的所有HTTP連接喘垂,默認(rèn)情況下啟用一個(gè)名為App Transport Security(ATS)的新安全功能。 ATS要求HTTP連接使用HTTPS(RFC 2818)绍撞。
有關(guān)詳細(xì)信息正勒,請(qǐng)參閱 Information Property List Key Reference中的NSAppTransportSecurity。
使用URL Session
使用NSURLSession
類(lèi)創(chuàng)建請(qǐng)求”
- 創(chuàng)建會(huì)話配置對(duì)象傻铣。對(duì)于后臺(tái)會(huì)話章贞,配置必須包含唯一的標(biāo)識(shí)樱衷。保存這個(gè)標(biāo)識(shí)节槐,如果應(yīng)用崩潰、退出或者掛起析桥,使用它和會(huì)話重新關(guān)聯(lián)起來(lái)两踏。
- 創(chuàng)建會(huì)話败京,指定配置對(duì)象,代理可選梦染。
- 在會(huì)話中創(chuàng)建任務(wù)對(duì)象赡麦,每一個(gè)任務(wù)代表一個(gè)資源請(qǐng)求朴皆。這個(gè)任務(wù)對(duì)象是
NSURLSessionTask
子類(lèi) -NSURLSessionDataTask
,NSURLSessionUploadTask
, 或者NSURLSessionDownloadTask
的對(duì)象,取決于要實(shí)現(xiàn)的行為泛粹。
每個(gè)任務(wù)處于掛起狀態(tài)遂铡,當(dāng)應(yīng)用調(diào)用任務(wù)的`resume`之后,它開(kāi)始下載指定的資源晶姊。
開(kāi)啟任務(wù)之后扒接,會(huì)話調(diào)用它的代理方法,如下:
如果與服務(wù)器的初次握手需要連接級(jí)挑戰(zhàn)(比如SSL客戶端證書(shū))帽借,NSURLSession調(diào)用
URLSession:task:didReceiveChallenge:completionHandler:
或者`URLSession:didReceiveChallenge:completionHandler: 代理方法珠增,如前面驗(yàn)證和TLS自定義里面描述的一樣。
關(guān)于會(huì)話驗(yàn)證代理方法的更多信息砍艾,查看URL Session Programming Guide蒂教。如果任務(wù)數(shù)據(jù)由流(stream)提供,
NSURLSession
對(duì)象調(diào)用代理的URLSession:task:needNewBodyStream:
方法以獲取NSInputStream
對(duì)象脆荷,這個(gè)對(duì)象為新的請(qǐng)求提供了請(qǐng)求體數(shù)據(jù)凝垛。在想服務(wù)器上傳請(qǐng)求提數(shù)據(jù)期間,代理周期性的接收
URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:
回調(diào)蜓谋,報(bào)告上傳進(jìn)度梦皮。服務(wù)器發(fā)送響應(yīng)。
如果響應(yīng)指示需要驗(yàn)證桃焕,會(huì)話調(diào)用它代理的
URLSession:task:didReceiveChallenge:completionHandler:
方法剑肯。回到第2步观堂。如果是一個(gè)HTTP重定向響應(yīng)让网。
NSURLSession
對(duì)象調(diào)用代理的URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:
方法。代理方法調(diào)用提供的完成處理者师痕,并傳遞NSURLRequest
對(duì)象(遵從重定向)溃睹,一個(gè)新的NSURLRequest
對(duì)象(重定向到其他URL),或者nil
(把重定向響應(yīng)體作為有效響應(yīng)胰坟,并作為結(jié)果返回)因篇。
* 如果遵從重定向,回到第2步笔横;
* 如果代理沒(méi)有實(shí)現(xiàn)這個(gè)方法竞滓,重定向會(huì)跟蹤到最大重定向數(shù)。
通過(guò)
downloadTaskWithResumeData:
或者downloadTaskWithResumeData:completionHandler:
方法創(chuàng)建的(重新)下載任務(wù)吹缔,NSURLSession
調(diào)用代理的URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:
方法虽界,并傳入一個(gè)新的任務(wù)對(duì)象。對(duì)于
data task
,NSURLSession
對(duì)象調(diào)用代理的URLSession:dataTask:didReceiveResponse:completionHandler:
方法涛菠。決定是否把數(shù)據(jù)任務(wù)(data task
)轉(zhuǎn)換為下載任務(wù)(download task
)莉御,然后調(diào)用完成回調(diào)以繼續(xù)接收或者下載數(shù)據(jù)撇吞。-
從服務(wù)器傳輸數(shù)據(jù)期間,代理周期性地接收任務(wù)級(jí)回調(diào)以報(bào)告?zhèn)鬏斶M(jìn)度礁叔。
對(duì)于數(shù)據(jù)任務(wù)牍颈,會(huì)話在接收到實(shí)際的數(shù)據(jù)片段時(shí)調(diào)用代理的
URLSession:dataTask:didReceiveData:
方法。對(duì)于下載任務(wù)琅关,會(huì)話調(diào)用委托的·煮岁、
URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:
方法,并傳入已成功寫(xiě)入磁盤(pán)的字節(jié)數(shù)涣易。 如果用戶告訴應(yīng)用暫停下載画机,調(diào)用cancelByProducingResumeData:
方法取消該任務(wù)。然后新症,如果用戶要求應(yīng)用恢復(fù)下載步氏,將返回的恢復(fù)數(shù)據(jù)傳遞給
downloadTaskWithResumeData:
或downloadTaskWithResumeData:completionHandler:
方法,以創(chuàng)建一個(gè)新的下載任務(wù)徒爹,繼續(xù)下載荚醒。 (回到步驟1) 對(duì)于
data task
,NSURLSession
對(duì)象可能調(diào)用代理的URLSession:dataTask:willCacheResponse:completionHandler:
方法。之后應(yīng)用應(yīng)該決定要不要緩存隆嗅。如果不實(shí)現(xiàn)這個(gè)方法界阁,默認(rèn)的行為是使用會(huì)話配置對(duì)象中的指定的緩存策略。如果響應(yīng)是多部分編碼的胖喳,則會(huì)話可以再次調(diào)用委托的didReceiveResponse方法泡躯,然后再執(zhí)行零次或多次額外的didReceiveData調(diào)用。 如果發(fā)生這種情況丽焊,請(qǐng)轉(zhuǎn)到步驟8(處理didReceiveResponse調(diào)用)较剃。
如果一個(gè)下載任務(wù)成功完成,
NSURLSession
對(duì)象調(diào)用任務(wù)的URLSession:downloadTask:didFinishDownloadingToURL:
粹懒,并傳入臨時(shí)文件的位置重付。應(yīng)用必須從文件讀取響應(yīng)數(shù)據(jù)或者在代理方法返回之前把文件移動(dòng)到持久存儲(chǔ)的位置顷级。任何任務(wù)完成時(shí)凫乖,
NSURLSession
對(duì)象調(diào)用代理的URLSession:task:didCompleteWithError:
方法,并傳入一個(gè)error
對(duì)象或者nil(如果任務(wù)順利完成)弓颈。
如果任務(wù)能夠恢復(fù)帽芽,`NSError`對(duì)象的`userInfo`字典包含與` NSURLSessionDownloadTaskResumeData `鍵對(duì)應(yīng)的值。應(yīng)用應(yīng)該使用這個(gè)值調(diào)用 `downloadTaskWithResumeData: `或者`downloadTaskWithResumeData:completionHandler:`創(chuàng)建一個(gè)新的下載任務(wù)以繼續(xù)已有的下載翔冀。
如果任務(wù)不能恢復(fù)导街,應(yīng)用應(yīng)該創(chuàng)建一個(gè)新的下載任務(wù),從開(kāi)始重新下載纤子。
不論哪種情況搬瑰,只要不是服務(wù)器錯(cuò)誤導(dǎo)致的傳輸失敗款票,回到第3步(創(chuàng)建和恢復(fù)任務(wù)對(duì)象)。
> ** 注意 **
NSURLSession不通過(guò)`error`參數(shù)報(bào)告服務(wù)器錯(cuò)誤泽论。代理從`error`參數(shù)接收到的錯(cuò)誤都是客戶端錯(cuò)誤艾少,比如不能解析或者連接到主機(jī)。錯(cuò)誤碼在`URL Loading System Error Codes`中有描述翼悴。
> 服務(wù)端錯(cuò)誤由`NSHTTPURLResponse ` 對(duì)象中的`HTTP`狀態(tài)碼報(bào)告缚够。更多信息,參閱`NSHTTPURLResponse` 和 `NSURLResponse ` 類(lèi)的文檔鹦赎。
- 如果不在需要
session
對(duì)象谍椅,可以調(diào)用invalidateAndCancel
(取消未完成的任務(wù)) 或者finishTasksAndInvalidate
(在作廢會(huì)話對(duì)象之前允許未完成的任務(wù)繼續(xù)完成)以作廢其對(duì)象。如果不作廢session
對(duì)象古话,它會(huì)在應(yīng)用程序終止時(shí)自動(dòng)消失(除非它是有激活任務(wù)的后臺(tái)會(huì)話)雏吭。
作廢會(huì)話之后,當(dāng)所有未完成的任務(wù)取消或者完成時(shí)煞额,會(huì)話對(duì)象調(diào)用代理的`URLSession:didBecomeInvalidWithError: `方法思恐。當(dāng)這個(gè)代理方法返回時(shí),代理對(duì)象清除其對(duì)代理的強(qiáng)引用膊毁。
如果應(yīng)用取消了正在進(jìn)行中的下載胀莹,NSURLSession
調(diào)用代理的URLSession:task:didCompleteWithError:
,和發(fā)生錯(cuò)誤一樣。
后臺(tái)傳輸注意事項(xiàng)
因?yàn)橹貑?yīng)用(或者等待用戶重新加載)代價(jià)相對(duì)更高婚温,一些功能在后臺(tái)會(huì)話中是不可用的描焰。結(jié)果就是:
-
session
必須為事件分發(fā)提供代理。因?yàn)閼?yīng)用可能會(huì)退出并且在傳輸?shù)倪^(guò)程中重新加載栅螟,不支持完成回調(diào)代碼塊荆秦。(對(duì)于上傳和下載,這些代理的行為與進(jìn)程內(nèi)傳輸相同)力图。 - 只支持
HTTP
和HTTPS
協(xié)議步绸。不支持其他內(nèi)置的網(wǎng)絡(luò)協(xié)議和自定義的協(xié)議。 - 只支持上傳和下載任務(wù)吃媒,不支持?jǐn)?shù)據(jù)任務(wù)(
data task
) - Redirects are always followed.
- 系統(tǒng)范圍內(nèi)并發(fā)的后臺(tái)傳輸?shù)臄?shù)量是有限制的瓤介。
- 如果后臺(tái)任務(wù)無(wú)法滿足系統(tǒng)指定的吞吐量限制,則可能被取消赘那。 也就是說(shuō)刑桑,如果長(zhǎng)時(shí)間運(yùn)行的任務(wù)在一段時(shí)間內(nèi)沒(méi)有發(fā)送或接收足夠的數(shù)據(jù),則可能被取消募舟,之后再重新開(kāi)始祠斧。 因此,盡可能使傳輸能夠恢復(fù)很重要拱礁。
- 如果后臺(tái)傳輸是在應(yīng)用程序處于后臺(tái)時(shí)啟動(dòng)的琢锋,則該任務(wù)被視為
discretionary
辕漂。 換句話說(shuō),它的行為就像一個(gè)會(huì)話中的任務(wù)吴超,其配置對(duì)象的discretionary
屬性為true
钮热。
如果這些限制和你的應(yīng)用需求沖突,你可以在非后臺(tái)會(huì)話中下載遠(yuǎn)程資源到一個(gè)文件中烛芬。如果你這樣做隧期,當(dāng)用戶把你的iOS應(yīng)用放到后臺(tái)或者退出MacOS應(yīng)用時(shí),調(diào)用cancelByProducingResumeData:
方法暫停所有激活的下載赘娄。當(dāng)用戶把應(yīng)用重新帶到前臺(tái)時(shí)仆潮,恢復(fù)下載。如果應(yīng)用在獲取恢復(fù)數(shù)據(jù)(resume data)之前就終止了遣臼,就不能再恢復(fù)下載性置。
** 注意 **
后臺(tái)會(huì)話是優(yōu)化后用于傳輸數(shù)量較少、能夠在必要時(shí)恢復(fù)的大資源揍堰。你可能想調(diào)研優(yōu)化服務(wù)器端行為的方法鹏浅,以便于此類(lèi)使用,比如:
- 向發(fā)送或者接收zip或者tar的終端發(fā)送請(qǐng)求而不是許多獨(dú)立的調(diào)用(making several individual calls)
- 向發(fā)送或接收增量差異的終端發(fā)送請(qǐng)求屏歹,以在客戶端和服務(wù)器之間進(jìn)行復(fù)制隐砸。
- 向返回上傳標(biāo)識(shí)的終端發(fā)送請(qǐng)求,之后能夠被用來(lái)追蹤和恢復(fù)向服務(wù)器傳輸數(shù)據(jù)蝙眶。
- 添加中間web服務(wù)季希,此服務(wù)代理請(qǐng)求到權(quán)威web服務(wù),以便于任何上述優(yōu)化幽纷。
NSCoping行為
會(huì)話和任務(wù)遵守NSCoping協(xié)議式塌,如下:
- 當(dāng)應(yīng)用拷貝會(huì)話或者任務(wù)時(shí),獲取到的是相同的對(duì)象友浸。(淺拷貝)
- 當(dāng)應(yīng)用拷貝配置對(duì)象時(shí)峰尝,獲取了一個(gè)新的副本能夠單獨(dú)修改。(深拷貝)
線程安全
URL session API自身是是線程安全的收恢。能夠隨意的在任何線程上下文創(chuàng)建會(huì)話和任務(wù)武学,當(dāng)代理方法調(diào)用提供的完成處理者(completion handler)時(shí),一切將自動(dòng)安排在正確的代理隊(duì)列上派诬。
警告
URLSessionDidFinishEventsForBackgroundURLSession:
代理方法可能會(huì)在其他線程調(diào)用劳淆。然而链沼,在iOS中默赂,你對(duì)這個(gè)方法的實(shí)現(xiàn)可能需要調(diào)用app代理的application:handleEventsForBackgroundURLSession:completionHandler:
方法中提供的完成處理者。必須在主線程中調(diào)用完成處理者括勺。