AFNetworking到底幫我們做了那些事情呢项阴?
這得先從NSURLConnection說起洒忧,NSURLConnection提供了
+ (void)sendAsynchronousRequest:(NSURLRequest*) request
queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse* __nullable response, NSData* __nullable data, NSError* __nullable connectionError)) handler;
方法來給我們發(fā)送請求,這個請求是在主線程發(fā)送的,請求發(fā)出后,如果用戶一直在操作UI上下滑動屏幕,那在滑動結(jié)束前是不會執(zhí)行回調(diào)函數(shù)的涧团。蘋果一直把動畫效果性能放在第一位,估計這也是蘋果提升UI動畫性能的手段之一经磅。
所以AFNetworking 創(chuàng)建了一條常駐線程專門處理所有請求的回調(diào)事件泌绣。網(wǎng)絡(luò)請求回調(diào)處理完,組裝好數(shù)據(jù)后再給上層調(diào)用者回調(diào)预厌,這時候回調(diào)是拋回主線程的阿迈,因為主線程是最安全的,使用者可能會在回調(diào)中更新UI轧叽,在子線程更新UI會導(dǎo)致各種問題苗沧,一般使用者也可以不需要關(guān)心線程問題刊棕。
AFURLConnectionOperation意義
那么AFURLConnectionOperation類型的意義就是這樣的:封裝了底層的NSURLConnection類型,改寫成一個可以異步執(zhí)行的NSOperation待逞,提供執(zhí)行(包括取消和暫停)和執(zhí)行狀態(tài)的接口甥角。通過AFURLConnectionOperation的屬性來獲取整個操作的結(jié)果,如responseData, responseString, error屬性等识樱。最后還可以通過進(jìn)度回調(diào)來獲取執(zhí)行過程中的進(jìn)度信息嗤无。
AFHTTPRequestOperation意義
AFHTTPRequestOperation類型直接繼承上面的AFURLConnectionOperation類型。其意義是在AFURLConnectionOperation類型上怜庸,加入了偏向HTTP的處理当犯,如對于整個HTTP操作成功的判斷,和暫停和繼續(xù)處理等割疾。
1. 關(guān)于操作的成功判定
核心是兩個數(shù)據(jù)灶壶,一個是NSIndexSet類型的acceptableStatusCodes代表可以被認(rèn)為算成功的HTTP返回碼,默認(rèn)就是200-299杈曲。另一個數(shù)據(jù)是NSSet類型的acceptableContentTypes驰凛。也就是需要的MIME類型。
有了這兩個數(shù)據(jù)担扑,AFHTTPRequestOperation就可以判斷整個操作是否成功恰响。于是AFHTTPRequestOperation又加入了另一個重要的方法:
- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;