AFNetworking做用和用法詳解

 

轉自:http://www.maxiaoguo.com/clothes/269.html

 

 

AFNetworking是一個輕量級的iOS網絡通訊類庫。它創建在NSURLConnection和NSOperation等類庫的基礎上,讓不少網絡通訊功能的實現變得十分簡單。它支持HTTP請求和基於REST的網絡服務(包括GET、POST、 PUT、DELETE等)。支持ARC。

[objc]  view plaincopy在CODE上查看代碼片派生到個人代碼片
 
  1. //  
  2. //  MJViewController.m  
  3. //  03.AFN演練  
  4. //  
  5. //  Created by apple on 14-4-30.  
  6. //  Copyright (c) 2014年 itcast. All rights reserved.  
  7. //  
  8.  #import "MJViewController.h"  
  9. #import "AFNetworking.h"    
  10. @interface MJViewController ()    
  11. @end   
  12. @implementation MJViewController  
  13. /** 
  14.  要使用常規的AFN網絡訪問 
  15.   
  16.  1. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];   
  17.     全部的網絡請求,均有manager發起   
  18.  2. 須要注意的是,默認提交請求的數據是二進制的,返回格式是JSON  
  19.     1> 若是提交數據是JSON的,須要將請求格式設置爲AFJSONRequestSerializer 
  20.     2> 若是返回格式不是JSON的,  
  21.  3. 請求格式   
  22.      AFHTTPRequestSerializer            二進制格式 
  23.      AFJSONRequestSerializer            JSON 
  24.      AFPropertyListRequestSerializer    PList(是一種特殊的XML,解析起來相對容易)   
  25.  4. 返回格式   
  26.      AFHTTPResponseSerializer           二進制格式 
  27.      AFJSONResponseSerializer           JSON 
  28.      AFXMLParserResponseSerializer      XML,只能返回XMLParser,還須要本身經過代理方法解析 
  29.      AFXMLDocumentResponseSerializer (Mac OS X) 
  30.      AFPropertyListResponseSerializer   PList 
  31.      AFImageResponseSerializer          Image 
  32.      AFCompoundResponseSerializer       組合 
  33.  */  
  34.   
  35. - (void)viewDidLoad  
  36. {  
  37.     [super viewDidLoad];  
  38.       
  39.     [self reach];  
  40. }  
  41.   
  42. #pragma mark - 演練  
  43. #pragma mark - 檢測網絡鏈接  
  44. - (void)reach  
  45. {  
  46.     /** 
  47.      AFNetworkReachabilityStatusUnknown          = -1,  // 未知 
  48.      AFNetworkReachabilityStatusNotReachable     = 0,   // 無鏈接 
  49.      AFNetworkReachabilityStatusReachableViaWWAN = 1,   // 3G 花錢 
  50.      AFNetworkReachabilityStatusReachableViaWiFi = 2,   // 局域網絡,不花錢 
  51.      */  
  52.     // 若是要檢測網絡狀態的變化,必須用檢測管理器的單例的startMonitoring  
  53.     [[AFNetworkReachabilityManager sharedManager] startMonitoring];        
  54.     // 檢測網絡鏈接的單例,網絡變化時的回調方法  
  55.     [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {  
  56.         NSLog(@"%d", status);  
  57.     }];  
  58. }  
  59.   
  60. #pragma mark - Session 下載  
  61. - (void)sessionDownload  
  62. {  
  63.     NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];  
  64.     AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:config];        
  65.     NSString *urlString = @"http://localhost/itcast/videos/01.C語言-語法預覽.mp4";  
  66.     urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];        
  67.     NSURL *url = [NSURL URLWithString:urlString];  
  68.     NSURLRequest *request = [NSURLRequest requestWithURL:url];       
  69.     NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {  
  70.         // 指定下載文件保存的路徑  
  71. //        NSLog(@"%@ %@", targetPath, response.suggestedFilename);  
  72.         // 將下載文件保存在緩存路徑中  
  73.         NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];  
  74.         NSString *path = [cacheDir stringByAppendingPathComponent:response.suggestedFilename];            
  75.         // URLWithString返回的是網絡的URL,若是使用本地URL,須要注意  
  76.         NSURL *fileURL1 = [NSURL URLWithString:path];  
  77.         NSURL *fileURL = [NSURL fileURLWithPath:path];            
  78.         NSLog(@"== %@ |||| %@", fileURL1, fileURL);            
  79.         return fileURL;  
  80.     } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {  
  81.         NSLog(@"%@ %@", filePath, error);  
  82.     }];        
  83.     [task resume];  
  84. }  
  85.   
  86. #pragma mark - POST JSON  
  87. - (void)postJSON  
  88. {  
  89.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];        
  90.     NSDictionary *dict = @{@"name"@"zhangsan"};  
  91.     NSDictionary *dict1 = @{@"name"@"wangwu"};  
  92.     NSArray *array = @[dict, dict1];  
  93.     // 設置請求格式  
  94.     manager.requestSerializer = [AFJSONRequestSerializer serializer];  
  95.     // 設置返回格式  
  96.     manager.responseSerializer = [AFHTTPResponseSerializer serializer];        
  97.     [manager POST:@"http://localhost/postjson.php" parameters:array success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  98.         NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];           
  99.         NSLog(@"%@", result);  
  100.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {            
  101.     }];  
  102.       
  103. }  
  104.   
  105. #pragma mark - 隨機文件名上傳  
  106. - (void)postUpload1  
  107. {  
  108.     // 本地上傳給服務器時,沒有肯定的URL,很差用MD5的方式處理  
  109.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  110.     manager.responseSerializer = [AFHTTPResponseSerializer serializer];        
  111.     [manager POST:@"http://localhost/demo/upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {           
  112.         NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"頭像1.png" withExtension:nil];           
  113.         // 要上傳保存在服務器中的名稱  
  114.         // 使用時間來做爲文件名 2014-04-30 14:20:57.png  
  115.         // 讓不一樣的用戶信息,保存在不一樣目錄中  
  116.         NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  
  117.         // 設置日期格式  
  118.         formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";  
  119.         NSString *fileName = [formatter stringFromDate:[NSDate date]];            
  120.         [formData appendPartWithFileURL:fileURL name:@"uploadFile" fileName:fileName mimeType:@"image/png" error:NULL];            
  121.     } success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  122.         NSLog(@"OK");  
  123.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  124.         NSLog(@"error");  
  125.     }];  
  126. }  
  127.   
  128. #pragma mark - POST上傳  
  129. - (void)postUpload  
  130. {  
  131.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  132.     // AFHTTPResponseSerializer就是正常的HTTP請求響應結果:NSData  
  133.     // 當請求的返回數據不是JSON,XML,PList,UIImage以外,使用AFHTTPResponseSerializer  
  134.     // 例如返回一個html,text...  
  135.     //  
  136.     // 實際上就是AFN沒有對響應數據作任何處理的狀況  
  137.     manager.responseSerializer = [AFHTTPResponseSerializer serializer];        
  138.     // formData是遵照了AFMultipartFormData的對象  
  139.     [manager POST:@"http://localhost/demo/upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {            
  140.         // 將本地的文件上傳至服務器  
  141.         NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"頭像1.png" withExtension:nil];            
  142.         [formData appendPartWithFileURL:fileURL name:@"uploadFile" error:NULL];  
  143.     } success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  144.         NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];            
  145.         NSLog(@"完成 %@", result);  
  146.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  147.         NSLog(@"錯誤 %@", error.localizedDescription);  
  148.     }];  
  149. }  
  150.   
  151. #pragma mark - JSON  
  152. - (void)XMLData  
  153. {  
  154.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];        
  155.     // 返回的數據格式是XML  
  156.     manager.responseSerializer = [AFXMLParserResponseSerializer serializer];        
  157.     NSDictionary *dict = @{@"format"@"xml"};        
  158.     // 網絡訪問是異步的,回調是主線程的,所以程序員不用管在主線程更新UI的事情  
  159.     [manager GET:@"http://localhost/videos.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {            
  160.         // 若是結果是XML,一樣須要使用6個代理方法解析,或者使用第三方庫  
  161.         // 第三方庫第三方框架,效率低,內存泄漏  
  162.         NSLog(@"%@", responseObject);  
  163.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  164.         NSLog(@"%@", error);  
  165.     }];  
  166. }  
  167.   
  168. #pragma mark - JSON  
  169. - (void)JSONData  
  170. {  
  171.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];        
  172.     // 本來須要拼接get訪問URL ? & =  
  173.     NSDictionary *dict = @{@"format"@"json"};        
  174.     // 網絡訪問是異步的,回調是主線程的,所以程序員不用管在主線程更新UI的事情  
  175.     [manager GET:@"http://localhost/videos.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  176.         NSLog(@"%@", responseObject);  
  177.         // 提問:NSURLConnection異步方法回調,是在子線程  
  178.         // 獲得回調以後,一般更新UI,是在主線程  
  179.         NSLog(@"%@", [NSThread currentThread]);  
  180.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  181.         NSLog(@"%@", error);  
  182.     }];  
  183. }  
  184.   
  185. #pragma mark - POST登陸  
  186. - (void)postLogin  
  187. {  
  188.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];        
  189.     // 本來須要拼接get訪問URL ? & =  
  190.     NSDictionary *dict = @{@"username"@"wangwu"@"password" : @"wang"};        
  191.     // 網絡訪問是異步的,回調是主線程的,所以程序員不用管在主線程更新UI的事情  
  192.     [manager POST:@"http://localhost/login.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  193.         NSLog(@"%@", responseObject);  
  194.         // 提問:NSURLConnection異步方法回調,是在子線程  
  195.         // 獲得回調以後,一般更新UI,是在主線程  
  196.         NSLog(@"%@", [NSThread currentThread]);  
  197.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  198.         NSLog(@"%@", error);  
  199.     }];  
  200. }  
  201.   
  202. #pragma mark - GET登陸  
  203. - (void)getLogin  
  204. {  
  205.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];        
  206.     // 本來須要拼接get訪問URL ? & =  
  207.     NSDictionary *dict = @{@"username"@"wangwu"@"password" : @"wang"};        
  208.     // 網絡訪問是異步的,回調是主線程的,所以程序員不用管在主線程更新UI的事情  
  209.     [manager GET:@"http://localhost/login.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {  
  210.         NSLog(@"%@", responseObject);  
  211.         // 提問:NSURLConnection異步方法回調,是在子線程  
  212.         // 獲得回調以後,一般更新UI,是在主線程  
  213.         NSLog(@"%@", [NSThread currentThread]);  
  214.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  215.         NSLog(@"%@", error);  
  216.     }];  
  217. }  
  218.   
  219. @end
相關文章
相關標籤/搜索