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