• AFNetworking


    • AFNetworking是 iOS 中使用最多的网络框架,一下是介绍它的简单使用,如果想在工程中应用 建议单独继承 AFHTTPRequestOperationManager 与 AFHTTPSessionManager,以防止以后出现停止更新而出现麻烦的解耦。
    • GET:
      • AFHTTPRequestOperation:
        - (void)get{
        AFHTTPRequestOperationManager*manager = [AFHTTPRequestOperationManager manager];
        /*
        第一个参数:需要请求的URL地址字符串
        第二个参数:请求时需要传递的参数
        第三个参数:请求成功的回调
        第四个参数:请求失败的回调
        */
        //注意:字典参数中不需要写? AFN会自动添加
        NSDictionary*dict = @{@"username":@"Mitchell",
                           @"pwd":@"123456"};
        [manager GET:@"" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
         //responseObject 服务器返回数据
         //注意点:如果服务器返回JSON,AFN会自动转换位OC对象
        } failure:^(AFHTTPRequestOperation * operation, NSError * error) {
         NSLog(@"%@",error);
        }];
        }
      • AFHTTPSessionManager
        NSDictionary*dict = @{@"username":@"Mitchell",
                            @"pwd":@"123456"};
        AFHTTPSessionManager*manager = [AFHTTPSessionManager manager];
        [manager GET:@"" parameters:dict success:^(NSURLSessionDataTask * task, id responseObject) {
        } failure:^(NSURLSessionDataTask * task, NSError * error) {
        }];
    • POST:
      • AFHTTPRequestOperation
        AFHTTPRequestOperationManager*manager = [AFHTTPRequestOperationManager manager];
        NSDictionary*dict = @{@"username":@"Mitchell",
                            @"pwd":@"123456"};
        [manager POST:@"" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
          //responseObject 服务器返回数据
          //注意点:如果服务器返回JSON,AFN会自动转换位OC对象
        } failure:^(AFHTTPRequestOperation * operation, NSError * error) {
          NSLog(@"%@",error);
        }];
      • AFHTTPSessionManager
        NSDictionary*dict = @{@"username":@"Mitchell",
                            @"pwd":@"123456"};
        AFHTTPSessionManager*manager = [AFHTTPSessionManager manager];
        [manager POST:@"" parameters:dict success:^(NSURLSessionDataTask * task, id responseObject) {
        } failure:^(NSURLSessionDataTask * task, NSError * error) {
        }];
    • 下载
        //图片:http://img1.imgtn.bdimg.com/it/u=298400068,822827541&fm=21&gp=0.jpg%2F2008-09-08%2F200898163242920_2.jpg&bdtype=0&fr=ala&ala=1&alatpl=others&pos=1
        //MP4:http://mvvideo1.meitudata.com/55d99e5939342913.mp4
        //1、创建AFHTTPSessionManager
        AFHTTPSessionManager*manager = [AFHTTPSessionManager manager];
        //创建NSProgress
        NSProgress*progress = [[NSProgress alloc]init];;
        self.progress = progress;
      //    progress.completedUnitCount;
      //    progress.totalUnitCount;
        //2、利用AFN下载文件
        NSURLRequest*request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://mvvideo1.meitudata.com/55d99e5939342913.mp4"]];
        //只要将NSProgress对象传递给AFN,AFN就会在内部自动给NSProgress赋值、会自动修改NSProgress的下载进度。
        NSURLSessionDownloadTask * task = [manager downloadTaskWithRequest:request progress:&progress destination:^ NSURL * (NSURL * targerUrl, NSURLResponse * response) {
            NSLog(@"请求完成 ");
            //请求完成的回调
            //targetPath:下载好的文件的路径
            //response:响应头
            //block的返回值:告诉AFN框架,是否需要将下载好的文件移动到其他路径下
            NSString*path = [response.suggestedFilename cacheDir];
            NSURL*destUrl = [NSURL fileURLWithPath:path];
            return destUrl;
        } completionHandler:^(NSURLResponse * response, NSURL * filePath, NSError * error) {
            NSLog(@"下载完成");
            //下载完成的回调
            //filePath:移动之后的文件路径
            NSLog(@"filePath = %@",filePath);
        }];
        //给NSProgress注册监听,监听progress.completedUnitCount属性的改变
        [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];
        //3、开启任务
        //注意:必须手动执行才会开始下载
        [task resume];
      -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
        if ([object isKindOfClass:[NSProgress class]]) {
            NSProgress*progress = (NSProgress*)object;        NSLog(@"%f",1.0*progress.completedUnitCount/progress.totalUnitCount);
        }
      }
    • 上传
      //1、创建AFN管理者
        AFHTTPSessionManager*manager = [AFHTTPSessionManager manager];
        //2、利用AFN上传文件
        NSDictionary*dic =@{@"username":@"username",@"pwd":@"123456"};
        [manager POST:@"address" parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
            //在这个block 中上传文件数据
            //formData就是专门用于保存需要上传文件的二进制数据的
            NSData*data = [NSData dataWithContentsOfFile:@""];
            //注意:该方法不能用于POST上传
      //        [formData appendPartWithFormData:data name:@"file"];
            /*
             第一个参数:需要上传的文件二进制
             第二个参数:服务器对应的参数名称
             第三个参数:文件的文件
             第四个参数:文件的MIME类型
             */
            [formData appendPartWithFileData:data name:@"file" fileName:@"abc.png" mimeType:@"image/png"];
            /*
             第一个参数:需要上传的文件的URL
             第二个参数:服务器对应的参数名称
             第三个参数:文件的文件
             第四个参数:文件的MIME类型
             */
            NSURL*url = [NSURL URLWithString:@"aaa"];
      //        [formData appendPartWithFileURL:url name:@"file" fileName:@"abc.png" mimeType:@"image/png" error:nil];
            //如果使用此方法上传文件,AFN会自动获取文件的名称和类型
            [formData appendPartWithFileURL:url name:@"file" error:nil];
              } success:^(NSURLSessionDataTask * task, id responseObject) {
            NSLog(@"成功的回调");
        } failure:^(NSURLSessionDataTask * task, NSError * error) {
            NSLog(@"失败的回调");
        }];
    • 序列化
        NSDictionary*dict = @{@"username":@"Mitchell",
                              @"pwd":@"123456"};
        AFHTTPSessionManager*manager = [AFHTTPSessionManager manager];
        //如果服务器返回的不是JSON数据,那么需要提iAFN如何处理数据
        //只要给AFN的responseSerializer属性赋值位AFXMLParserResponseSerializer,以后AFN就会将服务器的数据设为XML。
      //    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
        //只要给AFN的responseSerializer属性赋值位AFHTTPResponseSerializer,以后AFN就会将服务器的数据设为二进制。
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        [manager POST:@"" parameters:dict success:^(NSURLSessionDataTask * task, id responseObject) {
            //注意:AFN默认会将服务器返回的数据当做JSON处理
            //如果服务器返回的是JSON数据,那么会自动转换为OC对象
            NSLog(@"%@",[responseObject class]); 
        } failure:^(NSURLSessionDataTask * task, NSError * error) {
        }];
    • 网络监听
      - (void)afNetWorkReachAbility{
        AFNetworkReachabilityManager*manager = [AFNetworkReachabilityManager sharedManager];
        [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            /*
             typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
             AFNetworkReachabilityStatusUnknown          = -1,不能识别
             AFNetworkReachabilityStatusNotReachable     = 0,没有网
             AFNetworkReachabilityStatusReachableViaWWAN = 1,蜂窝网
             AFNetworkReachabilityStatusReachableViaWiFi = 2,局域网
             };
             */
            switch (status) {
                case AFNetworkReachabilityStatusUnknown:
                    NSLog(@"不能识别");
                    break;
                case AFNetworkReachabilityStatusNotReachable:
                    NSLog(@"没有网");
                    break;
                case AFNetworkReachabilityStatusReachableViaWWAN:
                    NSLog(@"蜂窝网");
                    break;
                case AFNetworkReachabilityStatusReachableViaWiFi:
                    NSLog(@"wifi");
                    break;
            }   
      }];
      }
    • 可选类型说明

      #pragma mark ------------------ 可选类型说明 ------------------
      - (void)detail{
        /*
         nullable:代表可以为nil
         __nonnull:代表不能为nil
         */
        /*
        AFHTTPSessionManager*manager = [AFHTTPSessionManager manager];
        [manager GET:@"www.baidu.com" parameters:nil success:^nullable void(NSURLSessionDataTask * __nonnull, id __nonnull) {
      
        } failure:^nullable void(NSURLSessionDataTask * __nonnull, NSError * __nonnull) {
        }];
         */
      }



    文/Mitchell(简书作者)
    原文链接:http://www.jianshu.com/p/28e934d1dd64
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 相关阅读:
    JS 循环遍历JSON数据 分类: JS技术 JS JQuery 2010-12-01 13:56 43646人阅读 评论(5) 收藏 举报 jsonc JSON数据如:{&quot;options&quot;:&quot;[{
    CLLocation的属性以及使用的解释
    单片机小白学步系列(十六) 单片机/计算机系统概述:模块化思想
    关于android中的单位(dp、sp)
    手动脱RLPack壳实战
    集成环信时遇到的问题file not found: libEaseMobClientSDK.a
    Cocos2dx 小技巧(九)现成的粒子特效
    设计模式
    2011 ACM-ICPC 成都赛区A题 Alice and Bob (博弈动规)
    hdu 2544 最短路(SPFA算法)
  • 原文地址:https://www.cnblogs.com/W-Kr/p/5462441.html
Copyright © 2020-2023  润新知