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
网友评论