本文主要是對官方文檔中URLConnection
類及其代理方法的翻譯和總結(jié). 文檔連接如下 :
溫馨提示 : iOS9以后蘋果宣布棄用NSURLConnection. 改用NSURLSession
NSURLConnection
一個NSURLConnection
對象代表加載一個URL request內(nèi)容. 然而NSURLConnection
的接口很少, 僅僅是start/cancel一個異步請求. 你應(yīng)該在URLRequest中做好一切設(shè)置.
概述
Note :
盡管該類的實例通常被稱為 connection, 但是這個connection并不是跟底層的網(wǎng)絡(luò)連接是1對1的關(guān)系.
NSURLConnection
類提供了很多很方便的同步/異步加載URLRequest的方法, 并且使用block回調(diào).
為了更好的對整個加載的流程做控制, 你可以成為NSURLConnection
實例的代理, 實現(xiàn)NSURLConnectionDelegate
和NSURLConnectionDataDelegate
協(xié)議. 這樣connection在異步加載請求的時候就會告訴你加載的進(jìn)度和狀態(tài)等信息. connection也會調(diào)用代理的方法讓用戶重寫它的默認(rèn)行為. (例如指定一個特定的重定位URL等等. ) 這些代理方法將會在發(fā)起該異步請求的線程上調(diào)用.
Note :
在加載請求期間, connection會強(qiáng)引用他的代理. 當(dāng)請求完成加載/加載失敗/取消的時候就會釋放這個強(qiáng)引用
關(guān)于NSURLError
的信息在這里
方法
一些過期的方法就不貼出來了
-
發(fā)送請求前
-
+canHandleRequest:
: 發(fā)送請求之前可以用該方法測試請求是否合法.
-
-
請求URL的信息
-
originalRequest
: 原請求的一份深拷貝 -
currentRequest
: 當(dāng)前請求
-
-
異步加載
-
-start
: 開始異步加載請求
-
-
停止加載
-
-cancel
: 取消異步加載請求
-
-
代理方法調(diào)度
-
-scheduleInRunLoop:forMode
: 設(shè)置代理方法調(diào)用的RunLoop和模式. -
-setDelegateQueue:
: 設(shè)置代理方法調(diào)用的隊列 -
-unscheduleFromRunLoop:forMode:
: 設(shè)置代理方法不要在該RunLoop和模式下調(diào)用
-
NSURLConnection Protocols
NSURLConnection
相關(guān)的有三個協(xié)議 :
- NSURLConnectionDelegate
- NSURLConnectionDataDelegate (繼承NSURLConnectionDelegate)
- NSURLConnectionDownloadDelegate (繼承NSURLConnectionDelegate)
NSURLConnectionDelegate
主要負(fù)責(zé)證書的處理和請求完成/錯誤的處理, 所以幾乎所有代理對象都必須遵循這個協(xié)議.
特殊情況下需要使用它的子協(xié)議 :
- 使用
Newsstand Kit
的downloadWithDelegate:
方法, 代理對象就應(yīng)該實現(xiàn)downloadDelegate. - 其他情況就實現(xiàn)dataDelegate.
如果代理想要自定義身份驗證的處理方法的話就要實現(xiàn)connection:?will?Send?Request?For?Authentication?Challenge:?
方法, 如果沒有實現(xiàn)則會調(diào)用connection:?can?Authenticate?Against?Protection?Space:?, connection:?did?Receive?Authentication?Challenge:
和connection:?did?Cancel?Authentication?Challenge:?
這兩個已經(jīng)棄用了的方法.
當(dāng)請求發(fā)生錯誤的時候就會調(diào)用代理的connection:?did?Fail?With?Error:?
方法. -connection?Should?Use?Credential?Storage:?
只會在加載之前調(diào)用一次.
方法
-
身份驗證 :
-
connection:?will?Send?Request?For?Authentication?Challenge:?
: 告訴代理準(zhǔn)備發(fā)送身份驗證質(zhì)詢. -
connection?Should?Use?Credential?Storage:?
: 決定URL加載器是否需要對身份驗證做證書存儲.
-
-
請求加載完成 :
-
connection:didFailWithError:
: 請求失敗
-
NSURLConnectionDataDelegate
提供了上傳的進(jìn)度信息/下載的response data碎片. 并且它還提供了一個新的上傳數(shù)據(jù)流, 如果服務(wù)器的響應(yīng)需要再次請求連接的話(例如使用不同的證書重新發(fā)請求).
方法
-
處理接受到的數(shù)據(jù) :
-
connection:?did?Receive?Response:?
: 第一次收到數(shù)據(jù) -
connection:?did?Receive?Data:??
: 依次收到后來的數(shù)據(jù)
-
-
加載進(jìn)度 :
-
connection:?did?Send?Body?Data:?total?Bytes?Written:?total?Bytes?Expected?To?Write:
: 發(fā)送一個類似HTTP POST請求的字典, 里面包含本次上傳的數(shù)據(jù)長度, 已經(jīng)上傳的數(shù)據(jù)長度和總數(shù)據(jù)長度. -
connection?Did?Finish?Loading:?
: 請求成功加載完成.
-
-
重定向處理 :
-
connection:?will?Send?Request:?redirect?Response:?
: 做URL重定向處理 -
connection:?need?New?Body?Stream:?
: 當(dāng)connection需要重新重傳的時候提供一個原本的數(shù)據(jù)流.
-
-
緩存策略 :
-
connection:?will?Cache?Response:?
: 當(dāng)系統(tǒng)準(zhǔn)備緩存該響應(yīng)數(shù)據(jù)的時候告訴代理.
-
NSURLConnectionDownloadDelegate
提供下載進(jìn)度信息, 下載完成時提供下載好的可訪問的文件的URL. 可以實現(xiàn)斷點(diǎn)續(xù)傳.
代理類除了實現(xiàn)該協(xié)議的方法之外還需要實現(xiàn)其父類協(xié)議NSURLConnectionDelegate
的方法.
方法
- 管理下載 :
-
connection:?did?Write?Data:?total?Bytes?Written:?expected?Total?Bytes:?
: 下載的時候會一直調(diào)用這個方法, 利用這幾個參數(shù)刷新UI的進(jìn)度條 -
connection?Did?Resume?Downloading:?total?Bytes?Written:?expected?Total?Bytes:?
: 當(dāng)恢復(fù)下載的時候告訴代理. -
connection?Did?Finish?Downloading:?destination?URL:?
: 下載完成的時候告訴代理目標(biāo)文件的URL.
-
由于iOS9之后, NSURLConnection已經(jīng)被棄用了, 接下來會帶來NSURLSession的文檔翻譯