天天看點

AFNetworking之前因後果

        應一些朋友的建議,這篇文章主要介紹一些AFNetworking的詳細使用。做iOS開發的童鞋應該沒有不知道AFNetworking,它可以說是目前最好用的開源網絡封裝架構。本人也是從2.0一直到最新的3.0都有過使用,也研讀了源代碼,雖然沒有完全參透,但是裡面的實作細節确實讓我學了很多。基于這個架構,很多app又做了二次封裝,比如唐巧的猿題庫,我也看過他們的源碼,寫的很不錯。對于一般的app,沒有必要封裝的很高端,可以根據實際情況适當做封裝即可。

        有些人可能做UI或者其他的比較多,對網絡沒有多少接觸,下面我結合官方文檔,教大家一步一步使用。

        首先,我先從2.x說起,根據我的調查,目前80%以上的都是在使用2.x。但随着蘋果2013  WWDC 上推出的NSURLSession,AFNetworking也在3.0上廢棄了以NSURLConnection為底層的傳輸架構。AFNetworking 1.0建立在NSURLConnection的基礎API之上,AFNetworking 2.0開始使用NSURLConnection的基礎API ,以及較新基于NSURLSession的API的選項。 AFNetworking 3.0現已完全基于NSURLSession的API,這降低了維護的負擔,同時支援蘋果增強關于NSURLSession提供的任何額外功能。

        在2.x中,一般的請求方式為:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"請求的url" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"成功");
} failure:^(AFHTTPRequestOperation *operation, NSError*error) {
        NSLog(@"失敗");
}];
           

AFNetworking也包括post請求等,使用方法與上面類似。當然如果你需要更加抽象的封裝,比如,所有方法都通過一個入口,可以使用AFHTTPRequestOperation類。在一些大公司或者大項目中,我們一般将post和get進行統一封裝,通過NSURLRequest設定post/get方式,然後通過 AFHTTPRequestOperation獲得請求,多個請求[[NSOperationQueue mainQueue] addOperation:op],添加到隊列,友善管理。以下為其中的類似用法:

NSURL *URL = [NSURL URLWithString:@"http://example.com "];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer = [AFHTTPResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
[[NSOperationQueue mainQueue] addOperation:op];
           

在此,需要告誡大家,根據app背景的不同,responseSerializer設定的不一樣,但是一般情況下都是需要設定的,否則會傳回錯誤,類似context/text類似的問題。

而在3.0中,AFNetworking舍棄了AFHTTPRequestOperationManager 和AFHTTPRequestOperation ,主打AFURLSessionManager 和AFHTTPSessionManager 。使用方法如下:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"%@ %@", response, responseObject);
}
}];
[dataTask resume];
           

當然也可以做進一步的封裝,AFURLSessionManager提供了包括get、post、delete等方法,我們可以将這些方法通過一個入口導入。今天介紹的屬于基本的使用方法,真正的項目開發中,網絡子產品經常需要進行二次封裝,一個好的封裝可以做到與UI層完全隔離,對外隻暴露參數傳入,其他的,比如逾時,url設定等等全部内部實作,做到解耦。如果大家有什麼問題,可以給我留言,本人也計劃開源自己的一套網絡封裝。

繼續閱讀