這是一篇AFNetworking的詳細(xì)解析
使用示例
新建一個(gè)AFHTTPSessionManager的manager,然后用manager請求對應(yīng)網(wǎng)址的信息,回調(diào)會(huì)調(diào)用success的completionHander代碼塊。
AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];
[manager GET:@"www.baidu.com"
parameters:nil
progress:nil
success:^(NSURLSessionDataTask * _Nonnull task,
id _Nullable responseObject) {
NSLog(responseObject);
} failure:nil];
AFNetworking流程圖

Paste_Image.png
- 調(diào)用post請求
- (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters
progress:(void (^)(NSProgress * _Nonnull))uploadProgress
success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success
failure:(void (^)(NSURLSessionDataTask * _Nullable,
NSError * _Nonnull))failure
- 新建一個(gè)task
- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
URLString:(NSString *)URLString
parameters:(id)parameters
uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress
downloadProgress:(nullable void (^)(NSProgress *downloadProgress))
downloadProgress
success:(void (^)(NSURLSessionDataTask *, id))success
failure:(void (^)(NSURLSessionDataTask *, NSError *))failure
- 新建一個(gè)request
- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
URLString:(NSString *)URLString
parameters:(id)parameters
error:(NSError *__autoreleasing *)error
- 新建一個(gè)dataTask
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
uploadProgress:(nullable void (^)(NSProgress *uploadProgress))
uploadProgressBlock downloadProgress:(nullable void (^)(NSProgress *downloadProgress))
downloadProgressBlock
completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject
, NSError * _Nullable error))completionHandler
- 添加delegate
- (void)addDelegateForDataTask:(NSURLSessionDataTask *)dataTask
uploadProgress:(nullable void (^)(NSProgress *uploadProgress))
uploadProgressBlock downloadProgress:(nullable void (^)(NSProgress *downloadProgress))
downloadProgressBlock
completionHandler:(void (^)(NSURLResponse *response
, id responseObject, NSError *error))completionHandler
整體架構(gòu)
- AFURLSessionManager的mutableTaskDelegatesKeyedByTaskIdentifier屬性,存放著每一個(gè)task對應(yīng)的AFURLSessionManagerTaskDelegate;
- AFURLSessionManager的NSURLSessionDelegate實(shí)現(xiàn),會(huì)調(diào)用每個(gè)task對應(yīng)的AFURLSessionManagerTaskDelegate;
- 設(shè)置Task的AFURLSessionManagerTaskDelegate時(shí),用了NSLock,進(jìn)行多線程同步;
- 任務(wù)的調(diào)度采用了工廠模式、觀察者和代理模式。
-
工廠模式
對于HTTP協(xié)議的請求有
AFHTTPRequestSerializer
AFJSONRequestSerializer
AFPropertyListRequestSerializer
三個(gè)都依賴抽象接口AFURLRequestSerialization
對于HTTP協(xié)議的響應(yīng)有
AFHTTPResponseSerializer
AFJSONResponseSerializer
AFXMLParserResponseSerializer
AFXMLDocumentResponseSerializer
AFPropertyListResponseSerializer
AFImageResponseSerializer
AFCompoundResponseSerializer
都依賴抽象接口 AFURLResponseSerialization
符合 開放-封閉原則
對增加新的請求頭、響應(yīng)頭是開放的,而且增加新內(nèi)容不需要修改原內(nèi)容 -
觀察者模式
對于task的每個(gè)生命周期,都會(huì)有相應(yīng)的事件發(fā)出
AFNetworkingTaskDidResumeNotification
AFNetworkingTaskDidSuspendNotification
對于task用KVO的方式去監(jiān)聽Progress -
代理模式
AFURLSessionManagerTaskDelegate 是AF對自己的邏輯封裝,同時(shí)實(shí)現(xiàn)了
NSURLSessionTaskDelegate,
NSURLSessionDataDelegate
NSURLSessionDownloadDelegate
同時(shí)通過實(shí)現(xiàn)NSURLSessionDelegate,來接受session級別的事件。
-
工廠模式