(轉)AFNetwork 作用和用法詳解

原文:http://blog.csdn.net/xn4545945/article/details/37945711
AFNetworking是一個輕量級的iOS網絡通信類庫 。它 建立在NSURLConnection和NSOperation等類庫 的基礎上,讓很多網絡通信功能的實現變得十分簡單。它支持HTTP請求和基于REST的網絡服務(包括GET、POST、 PUT、DELETE等)。支持ARC。

//
//  MJViewController.m
//  03.AFN演練
//
//  Created by apple on 14-4-30.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import "MJViewController.h"
#import "AFNetworking.h"

@interface MJViewController ()

@end

@implementation MJViewController
/**
 要使用常規的AFN網絡訪問
 
 1. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
 
  所有的網絡請求,均有manager發起
 
 2. 需要注意的是,默認提交請求的數據是二進制的,返回格式是JSON
 
  1> 如果提交數據是JSON的,需要將請求格式設置為AFJSONRequestSerializer
  2> 如果返回格式不是JSON的,
 
 3. 請求格式(請求參數的格式),默認是二進制格式
   AFHTTPRequestSerializer          設置請求參數為二進制格式(鍵值對的格式),一般默認是這種格式
   AFJSONRequestSerializer          設置請求參數為JSON格式
   AFPropertyListRequestSerializer          PList(是一種特殊的XML,解析起來相對容易)
 
 4. 返回格式(返回結果的格式),默認是JSON
   AFHTTPResponseSerializer        二進制格式
   AFJSONResponseSerializer        JSON
   AFXMLParserResponseSerializer      XML,只能返回XMLParser,還需要自己通過代理方法解析
   AFXMLDocumentResponseSerializer (Mac OS X)
   AFPropertyListResponseSerializer   PList
   AFImageResponseSerializer          Image
   AFCompoundResponseSerializer    組合

//設置可以接收的返回數據的格式
 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain",@"text/html",nil];
 */
PS:設置請求格式不會影響返回格式?
- (void)viewDidLoad
{
  [super viewDidLoad];
  
  [self reach];
}

#pragma mark - 演練
#pragma mark - 檢測網絡連接
- (void)reach
{
  /**
   AFNetworkReachabilityStatusUnknown         = -1,  // 未知
   AFNetworkReachabilityStatusNotReachable   = 0,   // 無連接
   AFNetworkReachabilityStatusReachableViaWWAN = 1,   // 3G 花錢
   AFNetworkReachabilityStatusReachableViaWiFi = 2,   // 局域網絡,不花錢
   */
  // 如果要檢測網絡狀態的變化,必須用檢測管理器的單例的startMonitoring
  [[AFNetworkReachabilityManager sharedManager] startMonitoring];
  
  // 檢測網絡連接的單例,網絡變化時的回調方法
  [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    NSLog(@"%d", status);
  }];
}

#pragma mark - Session 下載
- (void)sessionDownload
{
  NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
  AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:config];
  
  NSString *urlString = @"http://localhost/itcast/videos/01.C語言-語法預覽.mp4";
  urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  
  NSURL *url = [NSURL URLWithString:urlString];
  NSURLRequest *request = [NSURLRequest requestWithURL:url];
  
  NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
    // 指定下載文件保存的路徑
//      NSLog(@"%@ %@", targetPath, response.suggestedFilename);
    // 將下載文件保存在緩存路徑中
    NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    NSString *path = [cacheDir stringByAppendingPathComponent:response.suggestedFilename];
    
    // URLWithString返回的是網絡的URL,如果使用本地URL,需要注意
    NSURL *fileURL1 = [NSURL URLWithString:path];
    NSURL *fileURL = [NSURL fileURLWithPath:path];
    
    NSLog(@"== %@ |||| %@", fileURL1, fileURL);
    
    return fileURL;
  } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    NSLog(@"%@ %@", filePath, error);
  }];
  
  [task resume];
}

#pragma mark - POST JSON
- (void)postJSON
{
  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  
  NSDictionary *dict = @{@"name": @"zhangsan"};
  NSDictionary *dict1 = @{@"name": @"wangwu"};
  NSArray *array = @[dict, dict1];
  // 設置請求格式
  manager.requestSerializer = [AFJSONRequestSerializer serializer];
  // 設置返回格式
  manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  
  [manager POST:@"http://localhost/postjson.php" parameters:array success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    
    NSLog(@"%@", result);
  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    
  }];
  
}

#pragma mark - 隨機文件名上傳
- (void)postUpload1
{
  // 本地上傳給服務器時,沒有確定的URL,不好用MD5的方式處理
  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  
  [manager POST:@"http://localhost/demo/upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    
    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"頭像1.png" withExtension:nil];
    
    // 要上傳保存在服務器中的名稱
    // 使用時間來作為文件名 2014-04-30 14:20:57.png
    // 讓不同的用戶信息,保存在不同目錄中
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    // 設置日期格式
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSString *fileName = [formatter stringFromDate:[NSDate date]];
    
    [formData appendPartWithFileURL:fileURL name:@"uploadFile" fileName:fileName mimeType:@"image/png" error:NULL];
    
  } success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"OK");
  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"error");
  }];
}

#pragma mark - POST上傳
- (void)postUpload
{
  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  // AFHTTPResponseSerializer就是正常的HTTP請求響應結果:NSData
  // 當請求的返回數據不是JSON,XML,PList,UIImage之外,使用AFHTTPResponseSerializer
  // 例如返回一個html,text...
  //
  // 實際上就是AFN沒有對響應數據做任何處理的情況
  manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  
  // formData是遵守了AFMultipartFormData的對象
  [manager POST:@"http://localhost/demo/upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    
    // 將本地的文件上傳至服務器
    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"頭像1.png" withExtension:nil];
    
    [formData appendPartWithFileURL:fileURL name:@"uploadFile" error:NULL];
  } success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    
    NSLog(@"完成 %@", result);
  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"錯誤 %@", error.localizedDescription);
  }];
}

#pragma mark - JSON
- (void)XMLData
{
  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  
  // 返回的數據格式是XML
  manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
  
  NSDictionary *dict = @{@"format": @"xml"};
  
  // 網絡訪問是異步的,回調是主線程的,因此程序員不用管在主線程更新UI的事情
  [manager GET:@"http://localhost/videos.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
    
    // 如果結果是XML,同樣需要使用6個代理方法解析,或者使用第三方庫
    // 第三方庫第三方框架,效率低,內存泄漏
    NSLog(@"%@", responseObject);
  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error);
  }];
}

#pragma mark - JSON
- (void)JSONData
{
  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  
  // 原本需要拼接get訪問URL ? & =
  NSDictionary *dict = @{@"format": @"json"};
  
  // 網絡訪問是異步的,回調是主線程的,因此程序員不用管在主線程更新UI的事情
  [manager GET:@"http://localhost/videos.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"%@", responseObject);
    // 提問:NSURLConnection異步方法回調,是在子線程
    // 得到回調之后,通常更新UI,是在主線程
    NSLog(@"%@", [NSThread currentThread]);
  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error);
  }];
}

#pragma mark - POST登錄
- (void)postLogin
{
  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  
  // 原本需要拼接get訪問URL ? & =
  NSDictionary *dict = @{@"username": @"wangwu", @"password" : @"wang"};
  
  // 網絡訪問是異步的,回調是主線程的,因此程序員不用管在主線程更新UI的事情
  [manager POST:@"http://localhost/login.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"%@", responseObject);
    // 提問:NSURLConnection異步方法回調,是在子線程
    // 得到回調之后,通常更新UI,是在主線程
    NSLog(@"%@", [NSThread currentThread]);
  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error);
  }];
}

#pragma mark - GET登錄
- (void)getLogin
{
  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  
  // 原本需要拼接get訪問URL ? & =
  NSDictionary *dict = @{@"username": @"wangwu", @"password" : @"wang"};
  
  // 網絡訪問是異步的,回調是主線程的,因此程序員不用管在主線程更新UI的事情
  [manager GET:@"http://localhost/login.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"%@", responseObject);
    // 提問:NSURLConnection異步方法回調,是在子線程
    // 得到回調之后,通常更新UI,是在主線程
    NSLog(@"%@", [NSThread currentThread]);
  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error);
  }];
}

@end
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容