iOS 第三方AFNetworking

joker_king發表於2018-12-20

AFNetworking簡介

#import "AFURLRequestSerialization.h"//設定請求頭的資訊也就是請求的方式
#import "AFURLResponseSerialization.h"//設定響應頭的資訊
#import "AFSecurityPolicy.h"//封裝了證書驗證的過程
#import "AFNetworkReachabilityManager.h"//網路監測
#import "AFURLSessionManager.h"//網路請求,更偏向於網路上傳和下載
#import "AFHTTPSessionManager.h"//網路請求,偏向於請求資料
複製程式碼

AFNetworking是一個輕量級的網路請求API類庫,是以NSURLConnection,NSOperation和其他方法為基礎的。 AFNetworking3.0目前使用NSURLSesion作為網路類 核心類:AFHTTPSessionManager 針對 HTTP 細化了不同型別的請求操作( GET、HEAD、POST、PUT、PATCH、DELETE)

GET請求

在我們需要進行GET請求的時候我們只需要如下的一個方法就可以完成網路請求。

  • GET:介面網址
  • parameters:請求引數
  • progress:如果是下載資料的話,下載進度
  • success:資料請求成功的block回撥
  • failure:資料請求失敗的回撥
- (nullable NSURLSessionDataTask*)GET:(NSString *)URLString
                   parameters:(nullable id)parameters
                   progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress
                    success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                   failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
複製程式碼
  1. 在進行網路請求的時候我們首先需要一個網路請求的回話管理物件。 這個類是網路請求的核心類。
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
複製程式碼
  • 設定響應資料的格式
  • AFHTTPResponseSerializer 返回的資料型別為二進位制型別
  • AFJSONResponseSerializer 返回資料型別為json串
  • AFXMLParserResponseSerializer xml型別
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
複製程式碼
  • 實現GET請求的方法
[manager GET:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213" 
parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
        if (dic) {
//將解析出來的資料轉換成JSON串。方便我們列印觀看。
            if ([NSJSONSerialization isValidJSONObject:dic]) {
                NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
                NSString *printStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                NSLog(@"%@",printStr);
            }
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"請求失敗");
    }];
複製程式碼

POST請求

方法的引數和上面GET請求的引數類似

  1. 我們需要一個網路請求的回話管理物件
AFHTTPSessionManager *manage = [AFHTTPSessionManager manager];
複製程式碼
  1. 設定響應資料的格式,三種相應方式在GET請求中已經介紹了
anage.responseSerializer = [AFHTTPResponseSerializer serializer];
複製程式碼
  1. 設定引數,將引數設定成字典的形式。然後在方法中傳入一個字典,也可以是直接在方法中將引數以字串的形式傳入。
NSDictionary *dic = @{@"date":@"20151031",@"startRecord":@"1",@"len":@"5",@"udid":@"1234567890",
@"terminalType":@"Iphone",@"cid":@"213"};
複製程式碼
  1. 實現POST請求的方法
    [manage POST:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx" 
parameters:dic constructingBodyWithBlock:nil progress:nil success:
^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
//在這裡就已經獲得了我們請求回來的資料了。
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
        if ([NSJSONSerialization isValidJSONObject:dic]) {
            NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
            NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
            //列印當前的執行緒
            NSLog(@"%@ %@",string,[NSThread currentThread]);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@",error.description);
    }];
複製程式碼

以上就是使用AFNetWorking進行GET請求和POST請求的步驟

網路監測

當我們只需要在應用程式的一個地方監測網路狀態的時候,我們可以按照一下步驟來執行操作

  1. 我們需要一個網路監測的物件,在這裡我們也可以使用AFHTTPSessionManager
AFNetworkReachabilityManager *reachability = [AFNetworkReachabilityManager sharedManager];
複製程式碼
  1. 啟動網路監測
[reachability startMonitoring];
複製程式碼
  1. 實現網路監測的方法,當網路環境發生改變的時候,會執行block回撥。
[reachability setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"未知狀態");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"無網路連結");
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"3G 或者 4G狀態");
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"11WIFI狀態");
                break;
            default:
                break;
        }
    }];
複製程式碼

當我們需要在一個應用程式的多個地方使用到網路監測的時候 ,我們可以在AppDelegate使用通知中心的方法將網路的狀態傳遞過來

  1. 首先建立一個網路監測的物件
AFNetworkReachabilityManager *reachabilty = [AFNetworkReachabilityManager sharedManager];
複製程式碼
  1. 開啟網路監測
[reachabilty startMonitoring];
複製程式碼
  1. 實現一個監聽的方法,在方法的內部使用通知中心將網路的狀態傳送出去
[reachabilty setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
//告知網路發生變化的時候,我們傳送訊息通知,告知需要此訊息的物件。
        [[NSNotificationCenter defaultCenter]postNotificationName:kNetStatus object:@(status)];
    }];
複製程式碼
  1. 在我們需要監測網路狀態的地方新增一個觀察者,用來觀察網路的的變化
[[NSNotificationCenter defaultCenter]addObserver:
self selector:@selector(netChange:) name:kNetStatus object:nil];
複製程式碼
  1. 觀察者的回撥方法
-(void)netChange:(NSNotification *)notification{
//取出網路狀態
    AFNetworkReachabilityStatus status = [notification.object intValue];
            switch (status) {
                case AFNetworkReachabilityStatusUnknown:
                    NSLog(@"未知狀態");
                    break;
                case AFNetworkReachabilityStatusNotReachable:
                    NSLog(@"無網路連結");
                    break;
                case AFNetworkReachabilityStatusReachableViaWWAN:
                    NSLog(@"3G 或者 4G狀態");
                    break;
                case AFNetworkReachabilityStatusReachableViaWiFi:
                    NSLog(@"WIFI狀態");
                    break;
                default:
                    break;
            }
}
複製程式碼

以上的網路監聽,當我們只需要在一個地方監聽網路的狀態的時候,我們可以按照第一種的步驟來做,當需要在多個地方監聽網路的狀態的時候,我們就可以在AppDelegate中監聽網路的狀態,然後通過通知中心傳值的方式,將網路的狀態傳遞到,我們需要的地方。

相關文章