AFN常用类
AFHTTPSessionManager//管理者发送请求
AFNetworkReachabilityManager//网络监测
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请求
//创建管理者
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
网络监测
//检测网络状态
- (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];
}
上传图片案例演示向服务器上传多张图片的工具类
- (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]);
}];
}