2017-08-04iOS開發(fā)
概述
從上圖可以發(fā)現(xiàn),AFNetwoking框架是一個(gè)比較簡(jiǎn)潔的框架钾怔,主要分為了幾個(gè)部分
網(wǎng)絡(luò)通信模塊:NSURLSession
網(wǎng)絡(luò)狀態(tài)監(jiān)聽模塊:Reachability
網(wǎng)絡(luò)通信安全模塊:Security
網(wǎng)絡(luò)通信序列化模塊:Serialization
對(duì)UIKit框架擴(kuò)展部分:UIKit(以Catagory形式添加特性)
在這幾個(gè)模塊中宗侦,AFNetworking的核心模塊是通信模塊忆蚀,在通信模塊中有兩個(gè)類,AFHTTPSessionManager和AFURLSessionManager,其中前者繼承于后者茴厉,是對(duì)HTTP的專一化封裝處理矾缓。大家都知道AFNetworking 3.0其實(shí)只是對(duì)NSURLSession做了封裝處理嗜闻,那接下來琉雳,就從源碼角度來解釋這個(gè)事情翠肘,在這之前我們先來看看使用NSURLSession和使用AFNetworking做網(wǎng)絡(luò)請(qǐng)求在實(shí)現(xiàn)過程中有什么區(qū)別
使用區(qū)別
使用NSURLSession進(jìn)行網(wǎng)絡(luò)請(qǐng)求
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核心動(dòng)畫/" parameters:nil progress:nil
success:^(NSURLSessionDataTask * _Nonnull task, id ?_Nullable responseObject) {
// Success
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// error
}];
可以發(fā)現(xiàn)使用AFHTTPSessionManager進(jìn)行網(wǎng)絡(luò)請(qǐng)求大致分為了兩步:
創(chuàng)建一個(gè)AFHTTPSessionManager對(duì)象
使用這個(gè)對(duì)象調(diào)用含有block的請(qǐng)求方法
從調(diào)用上來看茶没,AFNetworking的請(qǐng)求會(huì)更加易讀和編寫抓半,接下來我們就看看這兩部分在框架中是如何實(shí)現(xiàn)的
內(nèi)部實(shí)現(xiàn)
AFHTTPSessionManager類的架構(gòu)
在方法列表中笛求,大致分為兩部分探入,第一部分是初始化方法
類初始化
對(duì)象初始化
manager這個(gè)類初始化方法是很常用的蜂嗽,我們?nèi)タ此膶?shí)現(xiàn)植旧,發(fā)現(xiàn)它也是調(diào)用了自己的對(duì)象初始化方法
+ (instancetype)manager {
return [[[self class] alloc] initWithBaseURL:nil];
}
那我們就先來研究一下第一個(gè)部分,初始化AFHTTPSessionManager的內(nèi)部實(shí)現(xiàn)亥鬓,我們首先來看看嵌戈,初始化方法的函數(shù)調(diào)用棧
- [AFHTTPSessionManager initWithBaseURL:]
- [AFHTTPSessionManager initWithBaseURL:sessionConfiguration:]
- [AFURLSessionManager initWithSessionConfiguration:] // #1
- [NSURLSession sessionWithConfiguration:delegate:delegateQueue:] // #2
- [AFJSONResponseSerializer serializer]
- [AFSecurityPolicy defaultPolicy]
- [AFNetworkReachabilityManager sharedManager]
- [AFHTTPRequestSerializer serializer]
- [AFJSONResponseSerializer serializer]
#1:調(diào)用了父類AFURLSessionManager的初始化方法
#2:調(diào)用了原生類NSURLSession的初始化方法
從上面的函數(shù)調(diào)用棧可以發(fā)現(xiàn),AFNetworking的內(nèi)部實(shí)現(xiàn)到棧底仍然是操作了原生的NSURLSession啊送,從根本上只是對(duì)原生的NSURLSession做了封裝操作馋没,封裝了一些序列化、通信安全等策略婆排,提供簡(jiǎn)潔的API段只,方便用戶編碼赞枕。
了解了初始化之后炕婶,我們?cè)賮砜纯窗l(fā)送請(qǐng)求的內(nèi)部實(shí)現(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這三個(gè)方法得到的是同一個(gè)對(duì)象列粪,來自#3的NSURLSessionDataTask對(duì)象
從這里也能發(fā)現(xiàn)請(qǐng)求操作內(nèi)部實(shí)現(xiàn)也是和原生NSURLSession操作一樣岂座,創(chuàng)建task费什,調(diào)用resume發(fā)送請(qǐng)求
總結(jié)
AFNetworking2.0和3.0區(qū)別很大,也是因?yàn)樘O果廢棄了NSURLConnection稿黍,而改用了NSURLSession巡球,AFNetworking3.0實(shí)際上只是對(duì)NSURLSession所做的操作進(jìn)行了高度封裝,提供更加簡(jiǎn)潔的API供編碼調(diào)用钉嘹。