首先來介紹下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是一個(gè)適用于iOS和Mac OS X兩個(gè)平臺(tái)的網(wǎng)絡(luò)庫,它是基于Foundation URL Loading System上進(jìn)行了一套封裝送膳,并且提供了豐富且優(yōu)美的API接口給使用者使用
相信從star數(shù)和fork數(shù)來看,大家都能明白這個(gè)庫是多么的受歡迎了丑蛤,所以了解這個(gè)庫對(duì)于一個(gè)iOS開發(fā)來說是極為重要的叠聋!
這個(gè)是AFNetworking的github地址:GitHub - AFNetworking/AFNetworking: A delightful networking framework for iOS
在使用前閱讀README是非常重要的,里面往往包括了這個(gè)庫的介紹受裹、安裝和使用等等碌补,對(duì)于快速了解一個(gè)庫來說,這是非常有幫助的
首先我們在AFNetWorking源碼地址里download下來棉饶,打開工程文件厦章,可以看到里面內(nèi)容分為兩個(gè)部分,一個(gè)是AFNetworking
照藻,另一個(gè)是UIKit+AFNetworking
很明顯袜啃,第一個(gè)是用來做網(wǎng)絡(luò)請求相關(guān)的,第二個(gè)則是和UI使用相關(guān)的幸缕,我們先看第一個(gè)
在看完頭文件和README之后群发,你會(huì)發(fā)現(xiàn)AFURLSessionManager
和AFHTTPSessionManager
是里面比較重要的兩個(gè)類
這里我先講AFURLSessionManager
這個(gè)類
首先瀏覽完這個(gè)類從API,發(fā)現(xiàn)其主要提供了數(shù)據(jù)的請求发乔、上傳和下載功能
在屬性方面:
@property(readonly,nonatomic,strong)NSArray *tasks;
@property(readonly,nonatomic,strong)NSArray *dataTasks;
@property(readonly,nonatomic,strong)NSArray *uploadTasks;
@property(readonly,nonatomic,strong)NSArray *downloadTasks;
通過這四個(gè)屬性熟妓,我們分別可以拿到總的任務(wù)集合、數(shù)據(jù)任務(wù)集合栏尚、上傳任務(wù)集合和下載任務(wù)集合
@property(nonatomic,assign)BOOL attemptsToRecreateUploadTasksForBackgroundSessions;
這個(gè)屬性非常重要起愈,注釋里面寫到,在iOS7中存在一個(gè)bug,在創(chuàng)建后臺(tái)上傳任務(wù)時(shí)告材,有時(shí)候會(huì)返回nil坤次,所以為了解決這個(gè)問題,AFNetworking遵照了蘋果的建議斥赋,在創(chuàng)建失敗的時(shí)候缰猴,會(huì)重新嘗試創(chuàng)建,次數(shù)默認(rèn)為3次疤剑,所以你的應(yīng)用如果有場景會(huì)有在后臺(tái)上傳的情況的話滑绒,記得將該值設(shè)為YES,避免出現(xiàn)上傳失敗的問題
FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidResumeNotification;
在對(duì)外提供的notification key里面隘膘,使用了FOUNDATION_EXPORT
來定義常量疑故,使用FOUNDATION_EXPORT
和extern
或者define
有什么區(qū)別呢?
FOUNDATION_EXPORT
在c文件編譯下是和extern等同弯菊,在c++文件編譯下是和extern “C”等同纵势,在32位機(jī)的環(huán)境下又是另外編譯情況,在兼容性方面管钳,FOUNDATION_EXPORT
做的會(huì)更好钦铁。
進(jìn)入到實(shí)現(xiàn)文件里面,我們可以看到在外部API調(diào)用dataTask才漆、uploadTask牛曹、downloadTask
方法實(shí)際上都是completionHanlder block
返回出來的,但是我們知道網(wǎng)絡(luò)請求是delegate
返回結(jié)果的醇滥,AF
內(nèi)部做了巧妙的操作黎比,他對(duì)每個(gè)task都增加代理設(shè)置
- (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];
});
// 每個(gè)task里面都會(huì)調(diào)用addDelegate方法
[self addDelegateForDataTask:dataTask uploadProgress:uploadProgressBlock downloadProgress:downloadProgressBlock completionHandler:completionHandler];
return dataTask;
}