- NSURLSessionDelegate
- NSURLSessionTaskDelegate
- NSURLSessionDataDelegate
- NSURLSessionDownloadDelegate
複製代碼
NSURLSession實例變量, AFN的全部網絡請求都必須經過 session建立的task實現
複製代碼
控制session綁定的代理方法 或者block回調的 隊列, 默認最大併發爲1, 串行隊列
複製代碼
遵循了 AFURLResponseSerialization協議, 會自動進行驗證和序列化 從服務端獲得的數據
複製代碼
AFSecurityPolicy 對象, 用來進行安全驗證的類
複製代碼
網絡狀態監聽對象, AFNetworkReachabilityManager
複製代碼
tasks數組 是 session中全部 currently run的 task的管理數組
複製代碼
dataTasks 是 currently run的全部請求數據類task的紀錄管理數組
複製代碼
uploadTasks是currently run的全部上傳文件類的task的紀錄管理數組
複製代碼
downloadTasks 是currently run的全部下載文件類的task的紀錄管理數組
複製代碼
AFURLSessionManagerTaskDelegate 類是對每次請求中task的相關處理的封裝, 每個任務(task) 都和對應的 delegate對象 綁定, 並以task.identifier爲key, delegate對象爲值, 經過key-value的方式被 AFURLSessionManager中的mutableTaskDelegatesKeyedByTaskIdentifier所管理設計模式
對數據上傳,數據下載進度的監聽的實現
複製代碼
也作了下載數據的存儲路徑的置頂
複製代碼
對網絡請求,下載,上傳等task(任務)完成後的回調處理
複製代碼
但它不是直接被會話對象(NSURLSession)處理的, 而是在AFURLSessionManager中實現的 NSURLSession相關的各個協議被觸發後,再根據當前的task 找到與之綁定的 AFURLSessionManagerTaskDelegate對象, 而後交給AFURLSessionManagerTaskDelegate對象去處理下一步的處理; 這裏就徹底提現了 AFURLSessionManagerTaskDelegate類的做用; (大神的設計思路真是使人膜拜!)數組
_AFURLSessionTaskSwizzling 存在的目的是爲了解決在OS7和iOS8中NSURLSessionTask的父類不一樣的問題; 經過runtime的原理,在load()方法中實現了 resume()和suspend()方法與 af_resume()和af_suspend方法的替換處理,這樣就解決了在iOS7和iOS8中由於NSURLSessionTask父類不一樣致使resume和suspend不統一的問題安全
繼承於AFURLSessionManager, 是AFN中對HTTP相關請求的封裝類, 主要提供了方便咱們進行POST, GET,HEAD, PATCH, DELETE的一些方法;bash
//詳細代碼
+ (instancetype)manager {
return [[[self class] alloc] initWithBaseURL:nil];
}
- (instancetype)init {
return [self initWithBaseURL:nil];
}
- (instancetype)initWithBaseURL:(NSURL *)url {
return [self initWithBaseURL:url sessionConfiguration:nil];
}
- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration {
return [self initWithBaseURL:nil sessionConfiguration:configuration];
}
複製代碼
@interface AFURLSessionManagerTaskDelegate : NSObject <NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate>
//weak的使用(manager持有task,task和delegate是綁定的,至關於manager是持有delegate的),在這種場景中採用 weak關鍵字來修飾
@property (nonatomic, weak) AFURLSessionManager *manager;
@end
複製代碼
代碼舉例:
@interface AFURLSessionManager ()
@property (readwrite, nonatomic, copy) AFURLSessionDataTaskDidReceiveResponseBlock dataTaskDidReceiveResponse;
@end
@implementation AFURLSessionManager
- (void)setDataTaskDidReceiveResponseBlock:(NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block {
self.dataTaskDidReceiveResponse = block;
}
@end
複製代碼