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
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
posted @ 2016-05-05 16:40  w_only  阅读(389)  评论(0编辑  收藏  举报