AFNetwoking源碼——基本架構

2017-08-04iOS開發(fā)

概述

從上圖可以發(fā)現(xiàn),AFNetwoking框架是一個比較簡潔的框架,主要分為了幾個部分

網絡通信模塊:NSURLSession

網絡狀態(tài)監(jiān)聽模塊:Reachability

網絡通信安全模塊:Security

網絡通信序列化模塊:Serialization

對UIKit框架擴展部分:UIKit(以Catagory形式添加特性)

在這幾個模塊中,AFNetworking的核心模塊是通信模塊,在通信模塊中有兩個類,AFHTTPSessionManager和AFURLSessionManager,其中前者繼承于后者,是對HTTP的專一化封裝處理。大家都知道AFNetworking 3.0其實只是對NSURLSession做了封裝處理,那接下來,就從源碼角度來解釋這個事情,在這之前我們先來看看使用NSURLSession和使用AFNetworking做網絡請求在實現(xiàn)過程中有什么區(qū)別

使用區(qū)別

使用NSURLSession進行網絡請求

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"https://www.nineteen.me"]];

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionDataTask *task = [session dataTaskWithRequest:request

completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"%@", dataString);

}];

[task resume];

2.使用AFHTTP

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[[NSURL alloc] initWithString:@"http://www.nineteen.me"]];

[manager GET:@"2017/07/24/iOS核心動畫/" parameters:nil progress:nil

success:^(NSURLSessionDataTask * _Nonnull task, id ?_Nullable responseObject) {

// Success

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

// error

}];

可以發(fā)現(xiàn)使用AFHTTPSessionManager進行網絡請求大致分為了兩步:

創(chuàng)建一個AFHTTPSessionManager對象

使用這個對象調用含有block的請求方法

從調用上來看,AFNetworking的請求會更加易讀和編寫,接下來我們就看看這兩部分在框架中是如何實現(xiàn)的

內部實現(xiàn)

AFHTTPSessionManager類的架構

在方法列表中,大致分為兩部分,第一部分是初始化方法

類初始化

對象初始化

manager這個類初始化方法是很常用的,我們去看它的實現(xiàn),發(fā)現(xiàn)它也是調用了自己的對象初始化方法

+ (instancetype)manager {

return [[[self class] alloc] initWithBaseURL:nil];

}

那我們就先來研究一下第一個部分,初始化AFHTTPSessionManager的內部實現(xiàn),我們首先來看看,初始化方法的函數(shù)調用棧

- [AFHTTPSessionManager initWithBaseURL:]

- [AFHTTPSessionManager initWithBaseURL:sessionConfiguration:]

- [AFURLSessionManager initWithSessionConfiguration:] // #1

- [NSURLSession sessionWithConfiguration:delegate:delegateQueue:] // #2

- [AFJSONResponseSerializer serializer]

- [AFSecurityPolicy defaultPolicy]

- [AFNetworkReachabilityManager sharedManager]

- [AFHTTPRequestSerializer serializer]

- [AFJSONResponseSerializer serializer]

#1:調用了父類AFURLSessionManager的初始化方法

#2:調用了原生類NSURLSession的初始化方法

從上面的函數(shù)調用??梢园l(fā)現(xiàn),AFNetworking的內部實現(xiàn)到棧底仍然是操作了原生的NSURLSession,從根本上只是對原生的NSURLSession做了封裝操作,封裝了一些序列化、通信安全等策略,提供簡潔的API,方便用戶編碼。

了解了初始化之后,我們再來看看發(fā)送請求的內部實現(xiàn),在這里就用

- [AFHTTPSessionManager GET:parameters:process:success:failure:]

- [AFHTTPSessionManager dataTaskWithHTTPMethod:parameters:uploadProgress:downloadProgress:success:failure:] // #1

- [AFHTTPRequestSerializer requestWithMethod:URLString:parameters:error:] // 獲得NSMutableURLRequest

- [AFURLSessionManager dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler:] // ?#2

- [NSURLSession dataTaskWithRequest:] // #3

- [AFURLSessionManager addDelegateForDataTask:uploadProgress:downloadProgress:completionHandler:] // 添加代理

- [AFURLSessionManagerTaskDelegate init]

- [AFURLSessionManager setDelegate:forTask:]

- [NSURLSessionDataTask resume]

#1、#2、#3這三個方法得到的是同一個對象,來自#3的NSURLSessionDataTask對象

從這里也能發(fā)現(xiàn)請求操作內部實現(xiàn)也是和原生NSURLSession操作一樣,創(chuàng)建task,調用resume發(fā)送請求

總結

AFNetworking2.0和3.0區(qū)別很大,也是因為蘋果廢棄了NSURLConnection,而改用了NSURLSession,AFNetworking3.0實際上只是對NSURLSession所做的操作進行了高度封裝,提供更加簡潔的API供編碼調用。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容