NSURLSession(URL會(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)下載墓律。

NSURLSession類(lèi)原生支持data赫粥,file谎亩,ftp梢薪,httphttps蹬铺。

使用NSURLSessionAPI,應(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)求。

  • NSURLSessionUploadTaskNSURLSessionDataTask相似坝初,也發(fā)送數(shù)據(jù)(通常以文件形式)浸剩,支持在應(yīng)用未運(yùn)行的情況下在后臺(tái)上傳。

  • NSURLSessionDownloadTask以文件的形式獲取數(shù)據(jù)鳄袍,支持在應(yīng)用未運(yùn)行的情況下在后臺(tái)下載和上傳绢要。

和大多數(shù)網(wǎng)絡(luò)API一樣,NSURLSessionAPI是異步的拗小。它以兩種方式中的一種返回?cái)?shù)據(jù)重罪,基于調(diào)用的方法:

  • 當(dāng)傳輸成功或者失敗時(shí),調(diào)用完成處理代碼塊(completion handler block);
  • 當(dāng)傳輸完成蛆封,數(shù)據(jù)到達(dá)時(shí)調(diào)用session的代理方法唇礁。

向代理分發(fā)信息之外,NSURLSessionAPI提供狀態(tài)和進(jìn)度屬性惨篱。如果需要可以查詢它們盏筐,根據(jù)當(dāng)前的任務(wù)狀態(tài)做程序決議。

URL session同時(shí)支持取消砸讳、重啟琢融、恢復(fù)和掛起任務(wù),并能夠在掛起簿寂、取消漾抬、下載失敗的位置恢復(fù)任務(wù)。

URL Session類(lèi)層級(jí)

NSURLSessionAPI包含以下類(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ù)

另外,NSURLSessionAPI提供了四個(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)性湿,比如NSURLConnectionNSURLDownload。其中一些共享類(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顯示了兩者之間的差異熬苍。

chanllenge_deferences.png

對(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)求”

  1. 創(chuàng)建會(huì)話配置對(duì)象傻铣。對(duì)于后臺(tái)會(huì)話章贞,配置必須包含唯一的標(biāo)識(shí)樱衷。保存這個(gè)標(biāo)識(shí)节槐,如果應(yīng)用崩潰、退出或者掛起析桥,使用它和會(huì)話重新關(guān)聯(lián)起來(lái)两踏。
  2. 創(chuàng)建會(huì)話败京,指定配置對(duì)象,代理可選梦染。
  3. 在會(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)用它的代理方法,如下:

  1. 如果與服務(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蒂教。

  2. 如果任務(wù)數(shù)據(jù)由流(stream)提供,NSURLSession對(duì)象調(diào)用代理的URLSession:task:needNewBodyStream:方法以獲取NSInputStream對(duì)象脆荷,這個(gè)對(duì)象為新的請(qǐng)求提供了請(qǐng)求體數(shù)據(jù)凝垛。

  3. 在想服務(wù)器上傳請(qǐng)求提數(shù)據(jù)期間,代理周期性的接收URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:回調(diào)蜓谋,報(bào)告上傳進(jìn)度梦皮。

  4. 服務(wù)器發(fā)送響應(yīng)。

  5. 如果響應(yīng)指示需要驗(yàn)證桃焕,會(huì)話調(diào)用它代理的URLSession:task:didReceiveChallenge:completionHandler:方法剑肯。回到第2步观堂。

  6. 如果是一個(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ù)。
  1. 通過(guò) downloadTaskWithResumeData: 或者downloadTaskWithResumeData:completionHandler:方法創(chuàng)建的(重新)下載任務(wù)吹缔,NSURLSession調(diào)用代理的URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes: 方法虽界,并傳入一個(gè)新的任務(wù)對(duì)象。

  2. 對(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ù)撇吞。

  3. 從服務(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)

  4. 對(duì)于data task,NSURLSession對(duì)象可能調(diào)用代理的URLSession:dataTask:willCacheResponse:completionHandler:方法。之后應(yīng)用應(yīng)該決定要不要緩存隆嗅。如果不實(shí)現(xiàn)這個(gè)方法界阁,默認(rèn)的行為是使用會(huì)話配置對(duì)象中的指定的緩存策略。

  5. 如果響應(yīng)是多部分編碼的胖喳,則會(huì)話可以再次調(diào)用委托的didReceiveResponse方法泡躯,然后再執(zhí)行零次或多次額外的didReceiveData調(diào)用。 如果發(fā)生這種情況丽焊,請(qǐng)轉(zhuǎn)到步驟8(處理didReceiveResponse調(diào)用)较剃。

  6. 如果一個(gè)下載任務(wù)成功完成,NSURLSession對(duì)象調(diào)用任務(wù)的URLSession:downloadTask:didFinishDownloadingToURL:粹懒,并傳入臨時(shí)文件的位置重付。應(yīng)用必須從文件讀取響應(yīng)數(shù)據(jù)或者在代理方法返回之前把文件移動(dòng)到持久存儲(chǔ)的位置顷级。

  7. 任何任務(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)的文檔鹦赎。
  1. 如果不在需要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)傳輸相同)力图。
  • 只支持HTTPHTTPS協(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)用完成處理者括勺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缆八,一起剝皮案震驚了整個(gè)濱河市曲掰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奈辰,老刑警劉巖栏妖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異奖恰,居然都是意外死亡吊趾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)瑟啃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)论泛,“玉大人,你說(shuō)我怎么就攤上這事蛹屿∑ㄗ啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵错负,是天一觀的道長(zhǎng)坟瓢。 經(jīng)常有香客問(wèn)我,道長(zhǎng)犹撒,這世上最難降的妖魔是什么折联? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮识颊,結(jié)果婚禮上崭庸,老公的妹妹穿的比我還像新娘。我一直安慰自己谊囚,他們只是感情好怕享,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著镰踏,像睡著了一般函筋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奠伪,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天跌帐,我揣著相機(jī)與錄音,去河邊找鬼绊率。 笑死谨敛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滤否。 我是一名探鬼主播脸狸,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了炊甲?” 一聲冷哼從身側(cè)響起泥彤,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卿啡,沒(méi)想到半個(gè)月后吟吝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颈娜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年剑逃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片官辽。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炕贵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出野崇,到底是詐尸還是另有隱情称开,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布乓梨,位于F島的核電站鳖轰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扶镀。R本人自食惡果不足惜蕴侣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臭觉。 院中可真熱鬧昆雀,春花似錦、人聲如沸蝠筑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)什乙。三九已至挽封,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臣镣,已是汗流浹背辅愿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忆某,地道東北人点待。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像弃舒,于是被迫代替她去往敵國(guó)和親癞埠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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