AFNetworking 3.0
AFNetworking 3.0 是AFNetworking最新發(fā)行的版本,一款在 iOS & Mac OS X 下都另開發(fā)者喜愛的網(wǎng)絡(luò)庫导饲。為了這個庫可維持性發(fā)展,3.0 刪除了所有支持現(xiàn)在已廢棄的 NSURLConnection 的API。如果您的工程之前使用過這些 API灰瞻,建議您升級到基于NSURLSession的 API傀履,當(dāng)然這不是必須的抹剩,根據(jù)自己的情況定。本指南將會指導(dǎo)您完成這一過程筐眷。(PS:AFNetworking最新的版本已經(jīng)更新到3.1.0,詳細(xì)文檔見 AFNetworking 3.1.0)
新的需求環(huán)境:iOS 7, Mac OS X 10.9, watchOS 2, tvOS 9, & Xcode 7
AFNetworking 3.0 已正式支持 iOS 7+, Mac OS X 10.9+, watchOS 2+, tvOS 9, and Xcode 7习柠。如果你想使用最新的 AFNetworking 庫替換舊版本的庫匀谣,請移步 README 查看兼容信息。
NSURLConnection的API已廢棄
AFNetworking 1.0 是建立在 NSURLConnection
基礎(chǔ)上的资溃,AFNetworking 2.0 開始使用基于 NSURLConnection API基礎(chǔ)功能武翎,或著基于新的NSURLSession API 的功能。AFNetworking 3.0現(xiàn)在是專門建立在 NSURLSession 頂層的溶锭,這降低了維護(hù)負(fù)擔(dān)后频,同時允許支持蘋果為 NSURLSession 提供的任何額外的增強(qiáng)的特性。在Xcode 7暖途,NSURLConnection API 已經(jīng)被蘋果官方棄用卑惜。然而API函數(shù)將繼續(xù)使用不會受影響,只不過再也不會添加新的功能了驻售,蘋果建議所有基于網(wǎng)絡(luò)的功能在未來都能使用 NSURLSession露久。
AFNetworking 2.x 系列將繼續(xù)獲得關(guān)鍵的bug修復(fù)和安全補(bǔ)丁,但是沒有新的功能將被添加進(jìn)去欺栗。Alamofire Software Foundation建議毫痕,所有項(xiàng)目將來都要遷移到基于 NSURLSession API。
被移除的類
3.0 被移除的類有:
? AFURLConnectionOperation
? AFHTTPRequestOperation
? AFHTTPRequestOperationManager
被更換的類
下述基于 NSURLConnection 內(nèi)部實(shí)現(xiàn)的類迟几,使用 NSURLSession 時都被重構(gòu)了:
? UIImageView+AFNetworking
? UIWebView+AFNetworking.h
? UIButton+AFNetworking.h
遷移
AFHTTPRequestOperationManager 基本代碼
AFHTTPRequestOperationManager ->AFHTTPSessionManager消请。
在這些類中有些組件是可重用的,包括:
? securityPolicy
? requestSerializer
? responseSerializer
下述是一個遷移到AFHTTPSessionManager的簡單示例类腮。
注意到 HTTP 返回的是 NSURLSessionTask 而不
是 AFHTTPRequestOperation臊泰,success and failure blocks 傳的參數(shù)是 NSURLSessionTask 而不是 AFHTTPRequestOperation
AFNetworking 2.x
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"請求的url" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"成功");
} failure:^(AFHTTPRequestOperation *operation, NSError*error) {
NSLog(@"失敗");
}];
AFNetworking 3.x
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:@"http://example.com/resources.json" parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(NSURLSessionTask *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
AFHTTPRequestOperation 基本代碼
不像 NSURLConnection 對象,這個對象共享了會話管理蚜枢,緩存策略缸逃,cookie存儲和URL 協(xié)議针饥,而 NSURLSession 對象可以獨(dú)立的配置這些。一旦會話被特定的配置初始化需频,他可以分派任務(wù)來獲取數(shù)據(jù)丁眼,上傳或者下載文件。
AFNetworking 2.0昭殉,影響了AFHTTPRequestOperation苞七,他有可能會創(chuàng)建一個沒有額外開銷的單一請求來獲取遠(yuǎn)程數(shù)據(jù)。NSURLSession 需要稍微多點(diǎn)的開銷挪丢,為了獲得請求本身功能的訪問入口莽鸭。
未來,創(chuàng)建一個單一的請求需要創(chuàng)建一個 AFHTTPSessionManager 吃靠,緊接著要創(chuàng)建一個任務(wù)并開啟這個任務(wù)硫眨。
AFNetworking 2.x
NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer = [AFJSONResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
[[NSOperationQueue mainQueue] addOperation:op];
AFNetworking 3.x
NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:URL.absoluteString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(NSURLSessionTask *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
注意到,NSURLSession 不是建立在 NSOperation 巢块。
如果你有一個應(yīng)用程序礁阁,很大程度上
依賴于AFURLConnectionOperation NSOperation 方面,那么恭喜你中槍了??族奢,你的程序可能會需要額外的重構(gòu)以便用 NSOperation 的基礎(chǔ)方法封裝 AFHTTPSessionManager 姥闭。
跟蹤進(jìn)度條
AFNetworking 3.0 使用 NSProgress 為 NSURLSessionTasks 跟蹤進(jìn)度。除了基于 AFURLSessionManager 的上傳和下載任務(wù) 和 基于 AFHTTPSessionManager 的GET和POST方法的 block 便利方法之外越走,AFURLSessionManager 也為每個任務(wù)暴露了輔助方法以便訪問 NSProgress 對象:
? uploadProgressForTask:
? downloadProgressForTask:
使用 KVO棚品,如果響應(yīng)包含 Content-Length 頭,那么每個任務(wù)的進(jìn)度都可以被跟蹤廊敌。AFNetworking 3.0中關(guān)于 progress 更多變化的額外信息請查看 #3187 铜跑。
UIKit 遷移
圖片下載已經(jīng)被遵循 AlamofireImage 架構(gòu)的
新類 AFImageDownloader 重構(gòu)。UIButton和UIImageView 分類實(shí)現(xiàn)將圖片下載的責(zé)任委托給這個類骡澈,并且暴露一些共享的參數(shù)用來允許自定義下載锅纺,從類接口下載遠(yuǎn)程圖像的實(shí)際方法保持不變。
UIWebView類已經(jīng)被使用一個共享的網(wǎng)絡(luò)請求 AFHTTPSessionManager 重構(gòu)肋殴。
UIAlertView 分類被移除
AFNetworking 3.0 已經(jīng)廢除了UIAlertView分類囤锉,并且未來也沒打算支持UIAlertController。