AFNetworking 3.0
AFNetworking 3.0 是AFNetworking最新發行的版本,一款在 iOS & Mac OS X 下都另開發者喜愛的網絡庫。為了這個庫可維持性發展,3.0 刪除了所有支持現在已廢棄的 NSURLConnection 的API。如果您的工程之前使用過這些 API,建議您升級到基于NSURLSession的 API,當然這不是必須的,根據自己的情況定。本指南將會指導您完成這一過程。(PS:AFNetworking最新的版本已經更新到3.1.0,詳細文檔見 AFNetworking 3.1.0)
新的需求環境: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
基礎上的,AFNetworking 2.0 開始使用基于 NSURLConnection API基礎功能,或著基于新的NSURLSession API 的功能。AFNetworking 3.0現在是專門建立在 NSURLSession 頂層的,這降低了維護負擔,同時允許支持蘋果為 NSURLSession 提供的任何額外的增強的特性。在Xcode 7,NSURLConnection API 已經被蘋果官方棄用。然而API函數將繼續使用不會受影響,只不過再也不會添加新的功能了,蘋果建議所有基于網絡的功能在未來都能使用 NSURLSession。
AFNetworking 2.x 系列將繼續獲得關鍵的bug修復和安全補丁,但是沒有新的功能將被添加進去。Alamofire Software Foundation建議,所有項目將來都要遷移到基于 NSURLSession API。
被移除的類
3.0 被移除的類有:
? AFURLConnectionOperation
? AFHTTPRequestOperation
? AFHTTPRequestOperationManager
被更換的類
下述基于 NSURLConnection 內部實現的類,使用 NSURLSession 時都被重構了:
? UIImageView+AFNetworking
? UIWebView+AFNetworking.h
? UIButton+AFNetworking.h
遷移
AFHTTPRequestOperationManager 基本代碼
AFHTTPRequestOperationManager ->AFHTTPSessionManager。
在這些類中有些組件是可重用的,包括:
? securityPolicy
? requestSerializer
? responseSerializer
下述是一個遷移到AFHTTPSessionManager的簡單示例。
注意到 HTTP 返回的是 NSURLSessionTask 而不
是 AFHTTPRequestOperation,success and failure blocks 傳的參數是 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 協議,而 NSURLSession 對象可以獨立的配置這些。一旦會話被特定的配置初始化,他可以分派任務來獲取數據,上傳或者下載文件。
AFNetworking 2.0,影響了AFHTTPRequestOperation,他有可能會創建一個沒有額外開銷的單一請求來獲取遠程數據。NSURLSession 需要稍微多點的開銷,為了獲得請求本身功能的訪問入口。
未來,創建一個單一的請求需要創建一個 AFHTTPSessionManager ,緊接著要創建一個任務并開啟這個任務。
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 。
如果你有一個應用程序,很大程度上
依賴于AFURLConnectionOperation NSOperation 方面,那么恭喜你中槍了??,你的程序可能會需要額外的重構以便用 NSOperation 的基礎方法封裝 AFHTTPSessionManager 。
跟蹤進度條
AFNetworking 3.0 使用 NSProgress 為 NSURLSessionTasks 跟蹤進度。除了基于 AFURLSessionManager 的上傳和下載任務 和 基于 AFHTTPSessionManager 的GET和POST方法的 block 便利方法之外,AFURLSessionManager 也為每個任務暴露了輔助方法以便訪問 NSProgress 對象:
? uploadProgressForTask:
? downloadProgressForTask:
使用 KVO,如果響應包含 Content-Length 頭,那么每個任務的進度都可以被跟蹤。AFNetworking 3.0中關于 progress 更多變化的額外信息請查看 #3187 。
UIKit 遷移
圖片下載已經被遵循 AlamofireImage 架構的
新類 AFImageDownloader 重構。UIButton和UIImageView 分類實現將圖片下載的責任委托給這個類,并且暴露一些共享的參數用來允許自定義下載,從類接口下載遠程圖像的實際方法保持不變。
UIWebView類已經被使用一個共享的網絡請求 AFHTTPSessionManager 重構。
UIAlertView 分類被移除
AFNetworking 3.0 已經廢除了UIAlertView分類,并且未來也沒打算支持UIAlertController。