首先來介紹下AFNetWorking
,官方介紹如下:
AFNetworking is a delightful networking library for iOS and Mac OS X. It’s built on top of theFoundation URL Loading System, extending the powerful high-level networking abstractions built into Cocoa. It has a modular architecture with well-designed, feature-rich APIs that are a joy to use.
Perhaps the most important feature of all, however, is the amazing community of developers who use and contribute to AFNetworking every day. AFNetworking powers some of the most popular and critically-acclaimed apps on the iPhone, iPad, and Mac.
Choose AFNetworking for your next project, or migrate over your existing projects—you’ll be happy you did!
翻譯過來簡單來說就是
AFNetworking是一個適用于iOS和Mac OS X兩個平臺的網絡庫,它是基于Foundation URL Loading System上進行了一套封裝,并且提供了豐富且優美的API接口給使用者使用
相信從star數和fork數來看,大家都能明白這個庫是多么的受歡迎了,所以了解這個庫對于一個iOS開發來說是極為重要的!
這個是AFNetworking的github地址:GitHub - AFNetworking/AFNetworking: A delightful networking framework for iOS
在使用前閱讀README是非常重要的,里面往往包括了這個庫的介紹、安裝和使用等等,對于快速了解一個庫來說,這是非常有幫助的
首先我們在AFNetWorking源碼地址里download下來,打開工程文件,可以看到里面內容分為兩個部分,一個是AFNetworking
,另一個是UIKit+AFNetworking
很明顯,第一個是用來做網絡請求相關的,第二個則是和UI使用相關的,我們先看第一個
在看完頭文件和README之后,你會發現AFURLSessionManager
和AFHTTPSessionManager
是里面比較重要的兩個類
這里我先講AFURLSessionManager
這個類
首先瀏覽完這個類從API,發現其主要提供了數據的請求、上傳和下載功能
在屬性方面:
@property(readonly,nonatomic,strong)NSArray *tasks;
@property(readonly,nonatomic,strong)NSArray *dataTasks;
@property(readonly,nonatomic,strong)NSArray *uploadTasks;
@property(readonly,nonatomic,strong)NSArray *downloadTasks;
通過這四個屬性,我們分別可以拿到總的任務集合、數據任務集合、上傳任務集合和下載任務集合
@property(nonatomic,assign)BOOL attemptsToRecreateUploadTasksForBackgroundSessions;
這個屬性非常重要,注釋里面寫到,在iOS7中存在一個bug,在創建后臺上傳任務時,有時候會返回nil,所以為了解決這個問題,AFNetworking遵照了蘋果的建議,在創建失敗的時候,會重新嘗試創建,次數默認為3次,所以你的應用如果有場景會有在后臺上傳的情況的話,記得將該值設為YES,避免出現上傳失敗的問題
FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidResumeNotification;
在對外提供的notification key里面,使用了FOUNDATION_EXPORT
來定義常量,使用FOUNDATION_EXPORT
和extern
或者define
有什么區別呢?
FOUNDATION_EXPORT
在c文件編譯下是和extern等同,在c++文件編譯下是和extern “C”等同,在32位機的環境下又是另外編譯情況,在兼容性方面,FOUNDATION_EXPORT
做的會更好。
進入到實現文件里面,我們可以看到在外部API調用dataTask、uploadTask、downloadTask
方法實際上都是completionHanlder block
返回出來的,但是我們知道網絡請求是delegate
返回結果的,AF
內部做了巧妙的操作,他對每個task都增加代理設置
- (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 {
__block NSURLSessionDataTask *dataTask = nil;
url_session_manager_create_task_safely(^{
dataTask = [self.session dataTaskWithRequest:request];
});
// 每個task里面都會調用addDelegate方法
[self addDelegateForDataTask:dataTask uploadProgress:uploadProgressBlock downloadProgress:downloadProgressBlock completionHandler:completionHandler];
return dataTask;
}