浅谈AFN的使用

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的使用)