AFNetworking 1.0是建立在NSURLConnection的基礎(chǔ)API上的 。
AFNetworking 2.0開始使用NSURLConnection的基礎(chǔ)API ,以及較新基于NSURLSession的API的選項。AFNetworking 3.0現(xiàn)已完全基于NSURLSession的API,這降低了維護(hù)的負(fù)擔(dān),同時支持蘋果增強(qiáng)關(guān)于NSURLSession提供的任何額外功能。由于Xcode 7中,NSURLConnection的API已經(jīng)正式被蘋果棄用。雖然該API將繼續(xù)運行,但將沒有新功能將被添加,并且蘋果已經(jīng)通知所有基于網(wǎng)絡(luò)的功能,以充分使NSURLSession向前發(fā)展。
在AFNetworking3.0中下面這些類已被廢棄:AFURLConnectionOperation,AFHTTPRequestOperation,AFHTTPRequestOperationManager。
這些類包含基于NSURLConnection的API的內(nèi)部實現(xiàn),他們已經(jīng)被使用NSURLSession重構(gòu):UIImageView+AFNetworking,UIWebView+AFNetworking,UIButton+AFNetworking。
??主要框架:網(wǎng)絡(luò)通信模塊NSUrlSession,網(wǎng)絡(luò)狀態(tài)監(jiān)聽模塊:Reachability,網(wǎng)絡(luò)通信安全模塊:Security,網(wǎng)絡(luò)通信序列化模塊:Serialization,對UIKit擴(kuò)展部分:UiKit。。
???? AFNetworking3.0實現(xiàn)機(jī)制
AFNetworking 3.0 實現(xiàn)完全基于NSURLSessionTask進(jìn)行封裝,NSURLSessionTask 是蘋果在iOS7 推出的網(wǎng)絡(luò)請求api。AF支持https,網(wǎng)絡(luò)數(shù)據(jù)請求,文件上傳,文件下載,監(jiān)聽手機(jī)網(wǎng)絡(luò)狀態(tài)。AFHttpSessionManager 繼承 AFURLSessionManager 對網(wǎng)絡(luò)請求進(jìn)行管理,使用AFURLRequestSerialization 對網(wǎng)絡(luò)請求進(jìn)行封裝,使用AFURLReponseSerialization 響應(yīng)體進(jìn)行處理,使用AFSecurityPolicy 對服務(wù)器證書進(jìn)行校驗。支持https協(xié)議,支持本地證書和服務(wù)器證書進(jìn)行對比驗證,AF要求ios7或以上系統(tǒng)。AF數(shù)據(jù)傳遞主要使用block 和 notifacation的方式。
???AFHTTPRequestOperationManager原理:
初始化manager之后,請求方式和解析方式設(shè)置了默認(rèn)值,也可以修改為自己的請求方式和解析方式,然后會將當(dāng)前任務(wù)添加進(jìn)操作隊列。AFHTTPRequestOperation繼承AFURLConnection,并且實現(xiàn)了相關(guān)的代理。當(dāng)operation啟動的時候start方法被調(diào)用,operationDIdstart方法會在【self class】返回線程中被調(diào)用。。這個新的小線程即AFNetworking,他在創(chuàng)建的時候就啟動了一個runloop事件循環(huán),并添加了一個NSMachPort空端口,其目的就是用來維護(hù)runloop的執(zhí)行不被退出。當(dāng)網(wǎng)絡(luò)請求數(shù)據(jù)到達(dá)的時候,網(wǎng)絡(luò)請求是個異步的過程,當(dāng)網(wǎng)絡(luò)請求數(shù)據(jù)流到達(dá)的時候,runloop會監(jiān)聽到事件源。。AFUrlConnectionOperation中的代理方法receive data也會被調(diào)用,網(wǎng)絡(luò)數(shù)據(jù)流也會寫進(jìn)緩存,寫入緩存完成后,didfinishloading會調(diào)用,self.state=AFOperationFinishedState,表示該請求任務(wù)已經(jīng)請求,而這個操作還坐了一個KVO操作,方法監(jiān)聽state狀態(tài)改變,然后回歸主線程,AFURLConnectionOperation中setCompletionBlock方法被回調(diào)。。self.completionBlock中內(nèi)容被執(zhí)行,這里邊id responseObject = self.responseObject獲得解析數(shù)據(jù),將stream中的數(shù)據(jù)解析成Json、xml,然后AFHTTPRequestOperation方法setCompletionBlockWithSuccess一回調(diào)。通常這個success block做我們自己處理的。
???AFHTTPSessionManager原理:
蘋果已經(jīng)對NSURLSessionDataTask做了高度封裝,原理跟AFURLConectionOperation差不多,到一個網(wǎng)絡(luò)數(shù)據(jù)流到達(dá)的時候,NSURLSession的URLSession:direceivedata方法就會被激活。AFURLSessionManager實現(xiàn)了NSURLSession的代理,AFURLSessionMnager代理方法會被調(diào)用。這樣網(wǎng)絡(luò)數(shù)據(jù)就被寫入self.mutableData,當(dāng)數(shù)據(jù)獲取完成之后URLSession:task:didcompleteWithError方法會調(diào)用,data=【self.mutabledata copy】,網(wǎng)絡(luò)數(shù)據(jù)會被copy到data中,網(wǎng)絡(luò)數(shù)據(jù)解析成了我們最終獲取到的數(shù)據(jù)。。self.completionHandler執(zhí)行代碼塊就回到了AFHTTPSessionManager的方法success? failure block就會被調(diào)用。