將 CocoaPods 安裝後,按照 CocoaPods 的使用說明就能夠將 AFNetworking 第三方集成到工程中,具體請看上篇博客iOS學習46之第三方CocoaPods的安裝和使用(通用方法)javascript
AFNetworking是一個 在iOS開發中 使用很是多網絡開源庫,是一個輕量級的網絡請求API類庫。php
適用於iOS以及Mac OS X。它構建於在(Apple iOS開發文檔) NSURLSession , NSOperation , 以及其餘熟悉的Foundation技術之上,核心代碼: AFHTTPSessionManager。html
它擁有良好的架構,豐富的api,以及模塊化構建方式,使得使用起來很是輕鬆。java
AFHTTPSessionManager是核心網絡請求的管理類,用於管理 GET 和 POST 請求api
AFHTTPSessionManager對象的聲明和懶加載代碼:網絡
#import "ViewController.h" // 網絡的請求頭文件 #import <AFNetworking/AFNetworking.h> @interface ViewController () /// 用於網絡請求的session對象 @property (nonatomic, strong) AFHTTPSessionManager *session; @end @implementation ViewController // 懶加載 - (AFHTTPSessionManager *)session { if (!_session) { _session = [AFHTTPSessionManager manager]; // 設置請求接口回來的時候,支持什麼類型的數據 _session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"application/x-json",@"text/html", nil]; } return _session; } @end
在進行網絡監測的時候,首先應該先判斷網絡監測是否打開,若是沒有打開,先要打開監測 session
- (void)startMonitoring; // 打開網絡監測 - (void)stopMonitoring; // 關閉網絡監測
接下來就判斷當前的網絡狀態,AFNetworking有幾種不一樣的網絡狀態架構
// 幾種不一樣的網絡狀態 typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) { AFNetworkReachabilityStatusUnknown = -1, // 當前網絡處於未知狀態,手機沒有信號 AFNetworkReachabilityStatusNotReachable = 0, // 當前網絡處於未鏈接狀態,手機沒有開流量或開WiFi AFNetworkReachabilityStatusReachableViaWWAN = 1, // 手機流量網絡 AFNetworkReachabilityStatusReachableViaWiFi = 2, // WiFi狀態 };
實例代碼:
app
#pragma mark - 網絡監測按鈕的響應方法 - (IBAction)networkMonitoringAction:(UIButton *)sender { if (!isOPen) { // 打開網絡監測的方法 [[AFNetworkReachabilityManager sharedManager] startMonitoring]; isOPen = YES; } else { // 關閉網絡監測 [[AFNetworkReachabilityManager sharedManager] stopMonitoring]; isOPen = NO; } // 接下來判斷當前是WiFi狀態還有3g狀態,網絡不可用狀態 [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case AFNetworkReachabilityStatusUnknown: NSLog(@"當前網絡處於未知狀態,手機沒有信號"); break; case AFNetworkReachabilityStatusNotReachable: NSLog(@"當前網絡處於未鏈接狀態,手機沒有開流量或開WiFi"); break; case AFNetworkReachabilityStatusReachableViaWWAN: NSLog(@"手機流量網絡"); break; case AFNetworkReachabilityStatusReachableViaWiFi: NSLog(@"WiFi狀態"); break; default: break; } }]; }
AFNetworking1.3.0 再也不想之前同樣一個 GET 請求須要不少的類參與,這裏這須要一個 AFHTTPSessionManager 的方法就能夠完成
方法:
- (NSURLSessionDataTask *)GET:(NSString *)URLString // get請求的網址 parameters:(id)parameters // 拼接的參數 progress:(void (^)(NSProgress * _Nonnull))downloadProgress // 下載的進度 success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success // 請求成功 failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure // 請求失敗
實例代碼:
#pragma mark - GET請求的響應方法 - (IBAction)getRequestAction:(id)sender { [self.session GET:@"http://api.yhouse.com/m/city/dynmiclist" // get請求的網址 parameters:nil // 拼接的參數 progress:^(NSProgress * _Nonnull downloadProgress) { // 下載的進度 NSLog(@"下載的進度"); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // 請求成功 NSLog(@"請求成功"); // 處理數據... NSDictionary *reusltDict = responseObject[@"data"]; NSArray *resultArray = reusltDict[@"allCity"]; for (NSDictionary *dict in resultArray) { NSLog(@"name = %@", dict[@"name"]); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // 請求失敗 NSLog(@"請求失敗"); }]; }
同GET請求同樣,POST請求也是如此,不過POST請求須要拼接參數,通常狀況下參數爲一個字典
方法:
- (NSURLSessionDataTask *)POST:(NSString *)URLString // post請求的網址 parameters:(id)parameters // 拼接的參數body progress:(void (^)(NSProgress * _Nonnull))uploadProgress // 上傳的進度 success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success // 請求成功 failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure // 請求失敗
實例代碼:
#pragma mark - POST請求的響應方法 - (IBAction)postRequestAction:(id)sender { NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php"; NSMutableDictionary *dict = @{ @"do" : @"pri_memberlist", @"member_id" : @"zpHr2dsRvQQxYJxo2", @"workspace_id" : @"ILfYpE4Dhs2gWcuQx" }.mutableCopy; [self.session POST:urlStr // post請求的網址 parameters:dict // 拼接的參數body progress:^(NSProgress * _Nonnull uploadProgress) { // 上傳的進度 NSLog(@"上傳的進度"); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // 請求成功 NSLog(@"請求成功"); NSDictionary *reusltDict = responseObject[@"res"]; NSArray *keyArray = reusltDict.allKeys; for (NSString *key in keyArray) { NSArray *resultArray = reusltDict[key]; for (NSDictionary *dict in resultArray) { NSLog(@"username = %@", dict[@"username"]); } } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // 請求失敗 NSLog(@"請求失敗"); }]; }
注意:URL字符串或body體中若是有特殊字符或者中文字符,AFNETWorking並無作UTF8的轉碼,須要:
url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
commonContent = [commonContent stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
代碼實例:
#pragma mark - POST請求2的響應方法 - (IBAction)postRequest2Action:(id)sender { NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php"; NSString *commonContent = @"類模塊計劃用到第三部分中,待提問、回答積累到必定數量時,便於你們的問題的快速查找,因此提問部分暫時不加入這個"; commonContent = [commonContent stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; // 當body體或URL中出現漢字時使用 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setValue:@"" forKey:@"address"]; [dict setValue:commonContent forKey:@"comment"]; [dict setValue:@"add_comment" forKey:@"do"]; [dict setValue:@"task" forKey:@"kind"]; [dict setValue:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"]; [dict setValue:@"" forKey:@"other"]; [dict setValue:@"55a47e79ec25e3641" forKey:@"task_id"]; [self.session POST:urlStr parameters:dict progress:^(NSProgress * _Nonnull uploadProgress) { NSLog(@"上傳成功"); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"請求成功:%@", responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"請求失敗"); }]; }