AFNetworking - AFURLSessionManager 源碼解讀

AFNetworking

核心通信類 NSURLSession

AFURLSessionManager

核心方法

遵循了NSURLSession相關的各個協議 , 協議方法的觸發是根據 task的類型來觸發

- NSURLSessionDelegate
	- NSURLSessionTaskDelegate
	- NSURLSessionDataDelegate
	- NSURLSessionDownloadDelegate
複製代碼

實例化方法initWithSessionConfiguration

經過 request 和 url來建立不一樣的task的一系列方法

持有的重要實例對象

會話對象 session

NSURLSession實例變量, AFN的全部網絡請求都必須經過 session建立的task實現
複製代碼

回調時的控制隊列 operationQueue

控制session綁定的代理方法 或者block回調的 隊列, 默認最大併發爲1, 串行隊列
複製代碼

返回數據序列化對象 responseSerializer

遵循了 AFURLResponseSerialization協議, 會自動進行驗證和序列化 從服務端獲得的數據
複製代碼

安全信任對象 securityPolicy

AFSecurityPolicy 對象, 用來進行安全驗證的類
複製代碼

網絡狀態監聽對象 reachabilityManager

網絡狀態監聽對象, AFNetworkReachabilityManager
複製代碼

task管理的數組對象 tasks, dataTasks, uploadTasks, downloadTasks

  • tasks數組 是 session中全部 currently run的 task的管理數組
    複製代碼
  • dataTasks 是 currently run的全部請求數據類task的紀錄管理數組
    複製代碼
  • uploadTasks是currently run的全部上傳文件類的task的紀錄管理數組
    複製代碼
  • downloadTasks 是currently run的全部下載文件類的task的紀錄管理數組
    複製代碼

相關聯的主要類

task中相關操做的管理類 AFURLSessionManagerTaskDelgate

AFURLSessionManagerTaskDelegate 類是對每次請求中task的相關處理的封裝, 每個任務(task) 都和對應的 delegate對象 綁定, 並以task.identifier爲key, delegate對象爲值, 經過key-value的方式被 AFURLSessionManager中的mutableTaskDelegatesKeyedByTaskIdentifier所管理設計模式

  • 對數據上傳,數據下載進度的監聽的實現
    複製代碼
  • 也作了下載數據的存儲路徑的置頂
    複製代碼
  • 對網絡請求,下載,上傳等task(任務)完成後的回調處理
    複製代碼

但它不是直接被會話對象(NSURLSession)處理的, 而是在AFURLSessionManager中實現的 NSURLSession相關的各個協議被觸發後,再根據當前的task 找到與之綁定的 AFURLSessionManagerTaskDelegate對象, 而後交給AFURLSessionManagerTaskDelegate對象去處理下一步的處理; 這裏就徹底提現了 AFURLSessionManagerTaskDelegate類的做用; (大神的設計思路真是使人膜拜!)數組

_AFURLSessionTaskSwizzling

_AFURLSessionTaskSwizzling 存在的目的是爲了解決在OS7和iOS8中NSURLSessionTask的父類不一樣的問題; 經過runtime的原理,在load()方法中實現了 resume()和suspend()方法與 af_resume()和af_suspend方法的替換處理,這樣就解決了在iOS7和iOS8中由於NSURLSessionTask父類不一樣致使resume和suspend不統一的問題安全

AFHTTPSessionManager

繼承於AFURLSessionManager, 是AFN中對HTTP相關請求的封裝類, 主要提供了方便咱們進行POST, GET,HEAD, PATCH, DELETE的一些方法;bash

  • 實例化方法 manager, manager方法採用的並非單利設計模式,而是工廠設計模式
//詳細代碼
+ (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];
}
複製代碼

在AFURLSessionManager中注意到的知識點

weak關鍵字的使用, 用來防止循環引用
@interface AFURLSessionManagerTaskDelegate : NSObject <NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate>
//weak的使用(manager持有task,task和delegate是綁定的,至關於manager是持有delegate的),在這種場景中採用 weak關鍵字來修飾
@property (nonatomic, weak) AFURLSessionManager *manager;
@end
複製代碼
將回調操做的block @property 屬性化到 AFURLSessionManager.h中, 並從新在AFURLSessionManager.m中set方法重寫, 方便被外部調用的設計思路
代碼舉例:
@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

複製代碼
AFURLSessionManagerTaskDelgate類的設計, 讓AFURLSessionManager管理 task和與之相對應的 AFURLSessionManagerTaskDelgate 對象, 將每一個task最後的數據處理, 進度處理轉移到 AFURLSessionManagerTaskDelgate 實例化對象中, 讓整個流程思路變得很是清晰明瞭
相關文章
相關標籤/搜索