• 网络AFNetworking 3.1


    下面的类已从AFNetworking 3.0中废弃:

    • AFURLConnectionOperation
    • AFHTTPRequestOperation
    • AFHTTPRequestOperationManager

     现在核心代码:AFHTTPSessionManager,<AFNrtworking3.1.0目前使用NSURLSession作为网络类!!!!>

    #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;
            }
            
        }] ;
    }

  • 相关阅读:
    [转载] 淘宝千万级并发分布式架构的14次演进
    [转载] 分布式锁用Redis还是Zookeeper?
    .Net面试题收集
    List,set,Map 的用法和区别
    android 布局中 layout_gravity、gravity、orientation、layout_weight
    Android getWindow().setFlags方法
    android动画之Interpolator和AnimationSet
    Android中Animation详解
    android ImageView scaleType属性
    tools:context=".MainActivity的作用
  • 原文地址:https://www.cnblogs.com/daxueshan/p/5899446.html
Copyright © 2020-2023  润新知