iOS AFNetWorking源碼詳解

首先來介紹下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)AFURLSessionManagerAFHTTPSessionManager是里面比較重要的兩個(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_EXPORTextern或者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;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鸳玩,隨后出現(xiàn)的幾起案子阅虫,更是在濱河造成了極大的恐慌,老刑警劉巖不跟,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件书妻,死亡現(xiàn)場離奇詭異,居然都是意外死亡躬拢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門见间,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聊闯,“玉大人,你說我怎么就攤上這事米诉×馐撸” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拴泌。 經(jīng)常有香客問我魏身,道長,這世上最難降的妖魔是什么蚪腐? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任箭昵,我火速辦了婚禮,結(jié)果婚禮上回季,老公的妹妹穿的比我還像新娘家制。我一直安慰自己,他們只是感情好泡一,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布颤殴。 她就那樣靜靜地躺著,像睡著了一般鼻忠。 火紅的嫁衣襯著肌膚如雪涵但。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天帖蔓,我揣著相機(jī)與錄音矮瘟,去河邊找鬼。 笑死讨阻,一個(gè)胖子當(dāng)著我的面吹牛芥永,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钝吮,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼埋涧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奇瘦?” 一聲冷哼從身側(cè)響起棘催,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耳标,沒想到半個(gè)月后醇坝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡次坡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年呼猪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砸琅。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宋距,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出症脂,到底是詐尸還是另有隱情谚赎,我是刑警寧澤淫僻,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站壶唤,受9級(jí)特大地震影響雳灵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闸盔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一悯辙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蕾殴,春花似錦笑撞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荡灾,卻和暖如春瓤狐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背批幌。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工础锐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荧缘。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓皆警,卻偏偏與公主長得像,于是被迫代替她去往敵國和親截粗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子信姓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 奧緯咨詢公司估計(jì)。讓人看到希望绸罗。過于樂觀了意推。出身王翔的在韓城這樣的賽道中優(yōu)勢會(huì)慢慢顯現(xiàn)。上港總計(jì)打進(jìn)了球珊蟀。來到雅加...
    jyqrtxlihn閱讀 197評(píng)論 0 0
  • 嗨大家好菊值,我出生于廣西桂林,目前是一個(gè)28歲還沒有結(jié)婚剩女育灸,在廣東省工廠里做一個(gè)文職工作腻窒,業(yè)余時(shí)間還在學(xué)習(xí)美容養(yǎng)生...
    童話故事沒有公主閱讀 443評(píng)論 0 0
  • 跨年作業(yè)【第3課作業(yè)】 找出一個(gè)你比較熟悉,并且認(rèn)為自己在這方面足夠?qū)I(yè)的領(lǐng)域磅崭,思考你能為人們解決什么方面的問題定页?...
    任紅_e290閱讀 170評(píng)論 0 0
  • 昨天跟幾位故人聚了一下,其中有一位朋友為我唱了一首《說謊》绽诚,雖然玩笑的成分大一些,但是我還是有些感觸。這位朋友已經(jīng)...
    姜小小不辣閱讀 446評(píng)論 0 1
  • 1恩够、房子進(jìn)入逐步裝飾中卒落,每個(gè)月添一些喜歡的東東進(jìn)去,慢慢的有了樣子蜂桶,很高興儡毕,也很有成就感和滿足感。 2扑媚、雖然買貴點(diǎn)...
    陌白Carl閱讀 162評(píng)論 0 0