AFNetworking自我總結

AFNetworking

簡介

  • 目前國內開發網絡應用使用最多的第三方框架
  • 是專爲 Mac OS & iOS 設計的一套網絡框架
  • 對 NSURLConnection 和 NSURLSession 作了封裝
  • 提供有豐富的 API
  • 提供了完善的錯誤解決方案
  • 使用簡單

官網地址

https://github.com/AFNetworking/AFNetworkingphp

學習第三方框架的步驟

  1. 獲取框架
    $ git clone https://github.com/AFNetworking/AFNetworking.git
     # 更新框架 $ git pull 
  2. 查看官方文檔
  3. 運行演示程序
  4. 創建學習分支
    • 分支是學習第三方框架和入手公司項目的重要手段!
  5. 編寫測試程序
  6. 少百度,若是實在困難,能夠谷歌

數據格式

請求的數據格式

  • AFURLRequestSerialization
類型 說明
AFHTTPRequestSerializer 二進制的,默認的
AFJSONRequestSerializer JSON(POST JSON) RESTful 設計風格須要
AFPropertyListRequestSerializer PList(POST Plist-開發中幾乎不用)

響應數據格式

  • AFURLResponseSerialization
類型 說明
AFHTTPResponseSerializer HTTP 二進制的
AFJSONResponseSerializer JSON 默認的
AFXMLParserResponseSerializer XML Parser 解析器 SAX 解析
AFXMLDocumentResponseSerializer (Mac OS X) XML DOM
AFPropertyListResponseSerializer PList 幾乎不用
AFImageResponseSerializer 圖像,不支持 GIF
AFCompoundResponseSerializer 組合的

數據格式小結

  • 大多狀況下,都是 JSON,不須要指定
  • XML 格式git

    • 若是 SAX 解析,須要指定格式
      mgr.responseSerializer = [AFXMLParserResponseSerializer serializer]; 
    • 而後利用代理方法解析程序員

    • 若是 DOM 解析,須要指定格式github

      mgr.responseSerializer = [AFHTTPResponseSerializer serializer]; 
    • 而後利用第三方框架解析
  • 圖像json

    • AFN 支持圖像緩存,也有對應的分類方法和 SDWebImage 很是像!
    • 可是:不支持 GIF

提示

  • 使用 AFN 時,必定記住輸出:error
  • 若是 state code == 200,就是數據格式錯誤,針對具體格式進行設置便可

補充

如下鏈接是移動開發中,常見的 XML 數據格式api

http://flash.weather.com.cn/wmaps/xml/china.xml緩存

 

官方演示程序

AppDelegate

設置緩存

NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil]; [NSURLCache setSharedURLCache:URLCache]; 

設置網絡訪問標示

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]; 

AFAppDotNetAPIClient

  • 提供全局網絡訪問入口bash

  • .h服務器

@interface AFAppDotNetAPIClient : AFHTTPSessionManager + (instancetype)sharedClient; @end 
  • .m
static NSString * const AFAppDotNetAPIBaseURLString = @"https://api.app.net/"; @implementation AFAppDotNetAPIClient + (instancetype)sharedClient { static AFAppDotNetAPIClient *_sharedClient = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedClient = [[AFAppDotNetAPIClient alloc] initWithBaseURL:[NSURL URLWithString:AFAppDotNetAPIBaseURLString]]; _sharedClient.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; }); return _sharedClient; } @end 

小結

  1. 在 AppDelegate 中設置緩存
  2. 在 AppDelegate 中設置網絡訪問指示器
  3. 繼承 AFHTTPSessionManager 建立單例統一管理網絡訪問
  4. 單例方法中使用了 BaseURL,設置後,再訪問該服務器,能夠直接使用相對路徑

代碼演練

常規代碼演練

- (void)postLogin { AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; NSDictionary *params = @{@"username": @"張三&李四", @"password": @"123"}; [mgr POST:@"http://localhost/login.php" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"POST Login %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }]; } - (void)getLogin2 { AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; NSDictionary *params = @{@"username": @"張三&李四", @"password": @"123"}; [mgr GET:@"http://localhost/login.php" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"GET Login %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }]; } - (void)getLogin1 { AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; [mgr GET:@"http://localhost/login.php?username=zhangsan&password=123" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }]; } - (void)getDemo { AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; [mgr GET:@"http://localhost/demo.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@ %@ %@", responseObject, [responseObject class], [NSThread currentThread]); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }]; } 

演練小結

  • 程序員不須要知道 URL,直接使用 URL 字符串
  • 自動實現 JSON 的反序列化
  • 網絡訪問完成的回調,是在主線程,程序員不須要考慮線程間通信
  • URL 的參數能夠使用 `字典的形式拼接,程序員不在須要考慮url` 的格式
  • 程序員不須要考慮百分號轉義
    • OC中的百分號轉義是有缺陷的,特殊字符例如&+= 用OC的百分號轉義就很差使了,這時候須要用到AFN中提供的方法
  • 程序員不須要知道 HTTP 方法,只須要挑選單詞便可!

XML 解析

SAX 解析

tools.responseSerializer = [AFXMLParserResponseSerializer serializer]; 

DOM 解析

tools.responseSerializer =[AFHTTPResponseSerializer serializer]; 

多值參數

NetworkTools *tools = [NetworkTools sharedNetworkTools];

NSDictionary *params = @{@"city": @[@"bj", @"sh", @"gz"]}; [tools GET:@"weather.php" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"%@", responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"%@", error); }]; 

PUT 上傳 & 進度跟進

- (void)putupload { NetworkTools *tools = [NetworkTools sharedNetworkTools]; NSString *urlString = @"http://localhost/uploads/321.png"; NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"PUT"; NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"001.png" withExtension:nil]; NSProgress *progress = nil; [[tools uploadTaskWithRequest:request fromFile:fileURL progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { NSLog(@"%@ %@", response, responseObject); }] resume]; // KVO [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([object isKindOfClass:[NSProgress class]]) { NSProgress *progress = object; NSLog(@"%@ - %@ - %f", progress.localizedDescription, progress.localizedAdditionalDescription, progress.fractionCompleted); } } 

網絡鏈接狀態監聽

[tools.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { NSLog(@"%zd", status); switch (status) { case AFNetworkReachabilityStatusNotReachable: NSLog(@"沒有鏈接"); break; case AFNetworkReachabilityStatusReachableViaWiFi: NSLog(@"WI-FI"); break; case AFNetworkReachabilityStatusReachableViaWWAN: NSLog(@"3G"); break; default: NSLog(@"未知"); break; } }]; [tools.reachabilityManager startMonitoring];
相關文章
相關標籤/搜索