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是一個適用于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之后,你會發現AFURLSessionManagerAFHTTPSessionManager是里面比較重要的兩個類

這里我先講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_EXPORTextern或者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;
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 奧緯咨詢公司估計。讓人看到希望。過于樂觀了。出身王翔的在韓城這樣的賽道中優勢會慢慢顯現。上港總計打進了球。來到雅加...
    jyqrtxlihn閱讀 229評論 0 0
  • 嗨大家好,我出生于廣西桂林,目前是一個28歲還沒有結婚剩女,在廣東省工廠里做一個文職工作,業余時間還在學習美容養生...
    童話故事沒有公主閱讀 453評論 0 0
  • 跨年作業【第3課作業】 找出一個你比較熟悉,并且認為自己在這方面足夠專業的領域,思考你能為人們解決什么方面的問題?...
    任紅_e290閱讀 172評論 0 0
  • 昨天跟幾位故人聚了一下,其中有一位朋友為我唱了一首《說謊》,雖然玩笑的成分大一些,但是我還是有些感觸。這位朋友已經...
    姜小小不辣閱讀 482評論 0 1
  • 1、房子進入逐步裝飾中,每個月添一些喜歡的東東進去,慢慢的有了樣子,很高興,也很有成就感和滿足感。 2、雖然買貴點...
    陌白Carl閱讀 174評論 0 0