【原】iOS學習之第三方-AFNetworking1.3.0

將 CocoaPods 安裝後,按照 CocoaPods 的使用說明就能夠將 AFNetworking 第三方集成到工程中,具體請看上篇博客iOS學習46之第三方CocoaPods的安裝和使用(通用方法)javascript

AFNetworking簡介

  • AFNetworking是一個 在iOS開發中 使用很是多網絡開源庫,是一個輕量級的網絡請求API類庫。php

  • 適用於iOS以及Mac OS X。它構建於在(Apple iOS開發文檔) NSURLSession ,  NSOperation , 以及其餘熟悉的Foundation技術之上,核心代碼: AFHTTPSessionManagerhtml

  • 它擁有良好的架構,豐富的api,以及模塊化構建方式,使得使用起來很是輕鬆。java

  • 官方連接http://cocoadocs.org/docsets/AFNetworking/1.3.0/json

AFHTTPSessionManager

 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

AFNetworking進行網絡監測

 在進行網絡監測的時候,首先應該先判斷網絡監測是否打開,若是沒有打開,先要打開監測 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;
        }
    }];
}

AFNetworking的GET請求

 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(@"請求失敗");
             }];
}

AFNetworking的POST請求

 同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(@"請求失敗");
              }];
}
相關文章
相關標籤/搜索