AFNetworking 3.0 版本使用

 

原創:http://www.zhimengzhe.com/IOSkaifa/38653.htmlphp

 

AFNetworking 3.0 版本使用html

在Xcode7.0以後,蘋果廢棄了NSURLConnection方法,數據請求使用NSURLSession,做爲網絡請求類第三方庫使用量最大的AFN也及時的更新的新的版本——AFN 3.0版本。新的版本的裏廢棄了基於NSURLConnection封裝的AFHTTPRequestOperationManager,轉而使用基於NSURLSession封裝的AFHTTPSessionManager了。ios

下面將詳細介紹AFN3.0的使用json

1.cocoapods導入AFN 3.0vim

1.1 進入到工程目錄下api

$ cd 工程目錄名緩存

1.2 搜索最新的AFN庫版本網絡

$ pod search AFNetworkingapp

1.3 建立podfile文件post

$ vim podfile

1.4 按下鍵盤「i」鍵,輸入以下的pod語句,而後按下「esc」鍵,退出編輯,再輸入「:wq」,保存退出vim,項目根目錄下就會新建咱們須要的podfile文件

$ platform:ios,'7.0'
$ pod 'AFNetworking','~>3.1.0'

1.5 導入AFN庫,使用以下語句導入和直接$ pod install的區別是略過cocoaPods的庫更新過程,導入速度較快

$ pod install --verbose --no-repo-update

導入成功,使用後綴名爲.xcworkspace的文件打開工程

 

2.配置plist文件

在Xcode 7.0以後,蘋果使用了https的網路協議,因此在網絡請求前,咱們還須要配置一下工程的Info.plist文件

右鍵Info.plist文件 -> open as -> source code ,找到下圖位置,粘貼以下代碼

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

 

iOS程序猿之AFNetworking 3.0 版本使用
3.使用AFN進行數據請求 3.1 請求管理類 (HttpsManager)

該類裏都是+號方法,不是單例類

在.h裏定義超時時間宏,以及成功和失敗的block塊

 

#define kTimeOutInterval 30 // 請求超時的時間
typedef void (^SuccessBlock)(NSDictionary *dict, BOOL success); // 訪問成功block
typedef void (^AFNErrorBlock)(NSError *error); // 訪問失敗block

 


封裝AFN請求管理者

 

#pragma mark - 建立請求者
+(AFHTTPSessionManager *)manager
{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    // 超時時間
    manager.requestSerializer.timeoutInterval = kTimeOutInterval;
    
    // 聲明上傳的是json格式的參數,須要你和後臺約定好,否則會出現後臺沒法獲取到你上傳的參數問題
    manager.requestSerializer = [AFHTTPRequestSerializer serializer]; // 上傳普通格式
//    manager.requestSerializer = [AFJSONRequestSerializer serializer]; // 上傳JSON格式
    
    // 聲明獲取到的數據格式
    manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // AFN不會解析,數據是data,須要本身解析
//    manager.responseSerializer = [AFJSONResponseSerializer serializer]; // AFN會JSON解析返回的數據
    // 我的建議仍是本身解析的比較好,有時接口返回的數據不合格會報3840錯誤,大體是AFN沒法解析返回來的數據
    return manager;
}

 


3.2 get

 

+ (void)getUserCarShopAndSalesDataForSalesWithUserId:(NSString *)userId date:(NSString *)date selectAreaType:(NSString *)areaType Success:(SuccessBlock)success fail:(AFNErrorBlock)fail
{
    // get請求也能夠直接將參數放在字典裏,AFN會本身講參數拼接在url的後面,不須要本身憑藉
    NSDictionary *param = @{@"user_id":userId, @"sale_date":date, @"accessToken":@"e9c0e60318ebd07ec2fe", @"area_type":areaType};
    // 建立請求類
    AFHTTPSessionManager *manager = [self manager];
    [manager GET:@"http://pm.yunhan-china.com/index.php/Api_sale/sales_get" parameters:param progress:^(NSProgress * _Nonnull downloadProgress) {
        // 這裏能夠獲取到目前數據請求的進度
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        // 請求成功
        if(responseObject){
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
            success(dict,YES);
        } else {
            success(@{@"msg":@"暫無數據"}, NO);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        // 請求失敗
        fail(error);
    }];
}

 


3.3 post

 

+ (void)loginWithUserAccount:(NSString *)account password:(NSString *)password success:(SuccessBlock)success fail:(AFNErrorBlock)fail
{
    // 將請求參數放在請求的字典裏
    NSDictionary *param = @{@"phoneNumber":account, @"password":@"f379eaf3c831b04de153469d1bec345e"};
    // 建立請求類
    AFHTTPSessionManager *manager = [self manager];
    [manager POST:@"http://pm.yunhan-china.com/index.php/api_common/login" parameters:param progress:^(NSProgress * _Nonnull uploadProgress) {
        // 這裏能夠獲取到目前數據請求的進度
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        // 請求成功
        if(responseObject){
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
            success(dict,YES);
        } else {
            success(@{@"msg":@"暫無數據"}, NO);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        // 請求失敗
        fail(error);
    }];
    
}

 

3.4 下載

 

- (void)downLoadWithUrlString:(NSString *)urlString
{
    // 1.建立管理者對象
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    // 2.設置請求的URL地址
    NSURL *url = [NSURL URLWithString:urlString];
    // 3.建立請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // 4.下載任務
    NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
        // 下載進度
        NSLog(@"當前下載進度爲:%lf", 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
        // 下載地址
        NSLog(@"默認下載地址%@",targetPath);
        // 設置下載路徑,經過沙盒獲取緩存地址,最後返回NSURL對象
        NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
        return [NSURL fileURLWithPath:filePath]; // 返回的是文件存放在本地沙盒的地址
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
        // 下載完成調用的方法
        NSLog(@"%@---%@", response, filePath);
    }];
    // 5.啓動下載任務
    [task resume];
}

 

 

3.5 上傳

 

- (void)uploadWithUser:(NSString *)userId UrlString:(NSString *)urlString upImg:(UIImage *)upImg
{
    // 建立管理者對象
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    // 參數
    NSDictionary *param = @{@"user_id":userId};
    [manager POST:urlString parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        /******** 1.上傳已經獲取到的img *******/
        // 把圖片轉換成data
        NSData *data = UIImagePNGRepresentation(upImg);
        // 拼接數據到請求題中
        [formData appendPartWithFileData:data name:@"file" fileName:@"123.png" mimeType:@"image/png"];
        /******** 2.經過路徑上傳沙盒或系統相冊裏的圖片 *****/
//        [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"文件地址"] name:@"file" fileName:@"1234.png" mimeType:@"application/octet-stream" error:nil];
        
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        // 打印上傳進度
        NSLog(@"%lf",1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //請求成功
        NSLog(@"請求成功:%@",responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        //請求失敗
        NSLog(@"請求失敗:%@",error);
    }];
}

 

 

3.6 網絡監聽

 

- (void)AFNetworkStatus{
    
    //1.建立網絡監測者
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    
    /*枚舉裏面四個狀態  分別對應 未知 無網絡 數據 WiFi
     typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
     AFNetworkReachabilityStatusUnknown          = -1,      未知
     AFNetworkReachabilityStatusNotReachable     = 0,       無網絡
     AFNetworkReachabilityStatusReachableViaWWAN = 1,       蜂窩數據網絡
     AFNetworkReachabilityStatusReachableViaWiFi = 2,       WiFi
     };
     */
    
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        //這裏是監測到網絡改變的block  能夠寫成switch方便
        //在裏面能夠隨便寫事件
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"未知網絡狀態");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"無網絡");
                break;
                
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"蜂窩數據網");
                break;
                
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WiFi網絡");
                
                break;
                
            default:
                break;
        }
        
    }] ;
}
相關文章
相關標籤/搜索