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供編碼調用。