1. 程式人生 > >iOS AFNETWorkIng的封裝類

iOS AFNETWorkIng的封裝類

    #import "HttpsManager.h"  

    @implementation HttpsManager  
    #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; } + (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); }]; } + (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); }]; } - (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]; } - (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); }]; } - (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; } }] ; } @end