美文网首页
浅谈AFN的使用

浅谈AFN的使用

作者: 迷路的安然和无恙 | 来源:发表于2016-06-18 19:17 被阅读2462次

    AFN作为网络处理第三方的老大地位,我就不赘述了,直接说使用,以下是所包含的四个类。

    • AFHTTPSessionManager管理者发送请求
    • AFNetworkReachabilityManager网络监测
    • ADSecurityPlicyhttps
    • AFURLResponseSeralization
      ==演示==
      AFN中的get和post请求
    • get请求
    //创建请求
    AFHTTPSessionManger *manger = [AFHTTPSession manger];
    //修改block的线程
    manager.completionQueue = dispatch_get_global_queue;
    NSDictionary *parma = @{@"name":@"xiaoxinxin",@"age":@18};
    //发送请求
    manager GET:@"" parameters:nil progress:nil success:^{
    //默认在主线程执行
    NSLog(@"%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]);
    }fileure^{
    NSLog(@"%@",[error localizedDescription]);
    }
    

    ==使用注意==
    * AFN发送的所有请求都是异步,不会阻塞主线程
    * 默认情况下是JSON解析
    * block代码块内容是在get和post请求完成之后才执行
    * block默认在主线程执行,如果希望修改代码块在子线程执行如下修改

    manager.completionQueue = dispatch_get_global_queue;
    
    • post请求

        - (void)postDemo {
        //创建管理者
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
         //更改执行的线程
        manager.completionQueue = dispatch_get_global_queue(0, 0);
        //更改默认请求的发送请求的二进制数据为JSON格式的二进制更改默  认的序列化方式
        manager.requestSerializer = [AFJSONRequestSerializer serializer];
        //更改响应默认的解析方式为字符串解析
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        //参数
         NSDictionary *parma = @{@"name":@"xiaoxinxin,@"age":@18};
        //发送数据
        [manager POST:@"http://192.168.23.7/post/postjson.php"  parameters:parma progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id_Nullable responseObject) {
        //默认在主线程执行
        NSLog(@"%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _ Nonnull error) {
        NSLog(@"%@",[error localizedDescription]);
        }];
      

    }

    **请求的序列化和反序列化**
    * AFN可以把OC对象转成三种方式的二进制,请求的普通二进制(默认的)
    * 解析二进制默认是JSON
    ==AFN的BaseURL==
    * 区分测试模式和正式模式
    ** AFN文件上传与网络监测 **
    * 网络监测
    
    

    //检测网络状态

    • (void)reachAbility {
      //创建一个单例manager
      AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
      //监测网络状态改变
      [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
      switch (status) {
      case AFNetworkReachabilityStatusUnknown:
      NSLog(@"没有网络");
      break;
      case AFNetworkReachabilityStatusNotReachable:
      NSLog(@"连接到路由器网络不能到达");
      break;
      case AFNetworkReachabilityStatusReachableViaWWAN:
      NSLog(@"2G/3G/4G");
      break;
      case AFNetworkReachabilityStatusReachableViaWiFi:
      NSLog(@"wifi");
      break;
      }
      }];
      //开启检测
      [manager startMonitoring];
      }
    **上传图片案例演示**[向服务器上传多张图片的工具类](https://github.com/giveMeHug)
    
    • (IBAction)selectPhotos:(id)sender {
      //创建图片多选控制器
      ZLPhotoPickerViewController *pickerVc = [[ZLPhotoPickerViewController alloc] init];
      //默认显示相册里面的内容SavePhotos
      pickerVc.status = PickerViewShowStatusSavePhotos;
      //选择图片的最小数,默认是9张图片最大也是9张
      pickerVc.maxCount = 4;
      [self presentViewController:pickerVc animated:YES completion:nil];
      // block回调或者代理
      //用block来代替代理
      __weak typeof(self) weakSelf = self;
      pickerVc.callBack = ^(NSArray *assets){
      for (ZLPhotoAssets *photoAsset in assets) {
      //将图片改成二进制
      NSData *data = UIImagePNGRepresentation(photoAsset.originImage);
      //给图片起名字
      NSString *filename = [NSString stringWithFormat:@"%d.png",arc4random_uniform(100)];
      //保存图片到字典中
      [weakSelf.fileDict setObject:data forKey:filename];
      }
      };
      }
    • (IBAction)uploadFile:(id)sender {
      //创建一个管理者
      AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
      //需要传入的参数
      NSDictionary *parma = @{
      @"status":@"upload succees"
      };
      //修改默认的二进制的传输类型为JSON格式的二进制
      manager.requestSerializer = [AFJSONRequestSerializer serializer];
      //发送请求
      [manager POST:@"http://192.168.23.7/post/upload-m.php" parameters:parma constructingBodyWithBlock:^(id_Nonnull formData) {
      //遍历字典formdata包括请求体拼接
      [self.fileDict enumerateKeysAndObjectsUsingBlock:^(NSString *saveFiledname,NSData *imageData, BOOL * _Nonnull stop) {
      //拼接文件参数拼接在formdata后面
      //第一个参数:文件的二进制
      //第二个参数:后台接收的字段名userfile[]
      /第三个参数:保存起来的名字saveFileName
      [formData appendPartWithFileData:imageData name:@"userfile[]" fileName:saveFiledname mimeType:@"image/png"];
      }];
      } success:^(NSURLSessionDataTask * _Nonnull task, id_Nullable responseObject) {
      //打印服务器返回的参数
      NSLog(@"%@",responseObject);
      } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
      //打印错误信息
      NSLog(@"%@",[error localizedDescription]);
      }];
      }
    AFN上传数据的方法appendPartWithFileData:
    
    • (void)appendPartWithFileData:(NSData *)data
      name:(NSString *)name
      fileName:(NSString *)fileName
      mimeType:(NSString *)mimeType;
      //参数1:fileData:需要上传的文件的二进制,如果是多文件,fileData指的是每一个文件的二进制
      //参数2:name:服务器用来接收传入数据的字段名
      //参数3:保存到服务器上的名字
      //参数:标记上传的数据的格式如image/png

    相关文章

      网友评论

          本文标题:浅谈AFN的使用

          本文链接:https://www.haomeiwen.com/subject/boqbdttx.html