AFNetworking你最最最起码要知道的基本使用~

  • AFNetworking是一个在iOS开发中,使用很是多的一个开源库
  • 适用于iOS以及Mac OS X, 它构建于在(Apple iOS开发文档)NSURLConnection, NSOperation,以及其余熟悉的Foundation技术之上
  • 官方连接 http://cocoadocs.org/docsets/AFNetworking/1.3.0/
  • 核心代码:AFHTTPRequestOperationManager
  • AFNetworking3.0目前使用NSURLSession做为网络类

CORE(核心):git

  • AFURLConnectionOperation : 继承自NSOperation实现了NSURLConnection的代理方法
  • AFHTTPRequestOperation : 继承自AFURLConnectionOperation的子类,当request请求使用的协议为HTTP和HTTPS时使用,它封装了用户决定request是否成功的状态码和内容类型
  • AFJSONRequestOperation : 继承自AFHTTPRequestOperation,用户下载和处理json response数据
  • AFXMLRequestOperation : 继承自AFHTTPRequestOperation,用于下载和处理xml response数据
  • AFPropertyListRequestOperation : 继承自AFHTTPRequestOperation,用户下载和处理property list response数据

HTTP CLIENT :json

AFHTTPClient : 是一个封装了基于http协议的网络应用程序的公共交流模式缓存

  • 发起基于根路径的使用基本的url相关路径来只作request
  • 为request自动添加http headers
  • 使用http基础整数或者OAuth来验证request
  • 为由client只作的erequest管理一个NSOperationQueue
  • 从NSDictionary省城一个查询字符串或http bodies
  • 从request中构建多部件
  • 自动的解析http response数据为响应的表现数据
  • 在网络可达性测试监控和响应变化

IMAGES服务器

  • AFImageRequestOperation : 一个AFHTTPRequestOperation的子类,用于下载和处理图片
  • UIImageView+AFNetworking : 添加一些方法UIImageView中, 为了从一个URL中异步加载远程图片

注意事项 :网络

  • AFNetworking能够进行JSON数据解析/plist数据解析(不支持XML数据解析)
  • URL字符串中若是有特殊字符或者中文字符,AFNetworking并无UTF8,须要 url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

示例代码 :app

get请求:异步

//GET请求 - (void)afGetMethod { //网络请求的核心类,http请求的会话管理对象 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //设置响应数据的格式 //AFHTTPResponseSerializer 返回的数据类型为二进制类型 //AFJSONResponseSerializer 返回数据类型为json类型 //AFXMLParserResponseSerializer xml类型 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //get请求 //第一个参数:请求网址 //第二个参数:请求参数 //第三个参数:下载进度 //第四个参数:请求成功的block回调 //第五个参数:数据请求失败 [manager GET:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // NSLog(@"----------%@",responseObject);//所须要的数据 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil]; NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil]; NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",str); NSLog(@"%@",[NSThread currentThread]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败"); }]; }

 

post请求:post

//post请求 - (void)afPostMethd { //会话管理对象 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //设置返回数据的格式 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //转义字符 // NSString *dict1 = @"{\\"data\\":20151031,\\"startRecord\\":1,\\"len\\":5,\\"udid\\":1234567890,\\"terminalType\\":\\"Iphone\\",\\"cid\\":213}"; NSDictionary *dict = @{@"data":@"20151031",@"startRecord":@"1",@"len":@"5",@"udid":@"1234567890",@"terminalType":@"Iphone",@"cid":@"213"}; //对象类型转json串 // NSData *strData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil]; // NSString *jsonStr = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding]; // NSLog(@"%%"); //constructingBodyWithBlock:在此block种能够为上传的参数添加(拼接)新的须要的上传的数据,适用于上传给服务器的数据流比较大的时候 //af中通常post请求的参数都为字典类型 [manager POST:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx" parameters:dict constructingBodyWithBlock:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil]; NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil]; NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"-------------***%@",str); NSLog(@"%@",[NSThread currentThread]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败"); }]; }

 

 

网络监测 :测试

  • 一般写在AppDelegate.m文件中,经过通知,在其余ViewController中建立观察者对其status进行观察

AppDelegate.m文件中ui

AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    //开始监测 [manager startMonitoring]; //网络状态的返回 [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { //当网络发生变化的时候,咱们发送通知,告知须要此消息的对象 [[NSNotificationCenter defaultCenter] postNotificationName:kNetStatus object:@(status)]; }];

ViewController.m文件中

//添加一个观察者,观察网络的变化 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netChange:) name:kNetStatus object:nil]; //通知的回调方法 - (void)netChange:(NSNotification*)notification { //取出网络状态 AFNetworkReachabilityStatus status = [notification.object intValue]; switch (status) { case AFNetworkReachabilityStatusUnknown: NSLog(@"未知状态"); break; case AFNetworkReachabilityStatusNotReachable: NSLog(@"无网络链接"); break; case AFNetworkReachabilityStatusReachableViaWWAN: NSLog(@"3G/4G"); break; case AFNetworkReachabilityStatusReachableViaWiFi: NSLog(@"WiFi"); break; default: break; } }

 

上传与下载

#pragma mark - 上传 //有两种方式 //第一种方法是经过工程中的文件进行上传 - (void)upLoad1 { //1.建立管理者对象 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //2.上传文件 NSDictionary *dict = @{@"username":@"1234"}; //上传至哪一个url NSString *url = @"1235466"; [manager POST:url parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { //上传文件参数 UIImage *image = [UIImage imageNamed:@"4.png"]; NSData *data = UIImagePNGRepresentation(image); //这个就是参数 [formData appendPartWithFileData:data name:@"file" fileName:@"4.png" mimeType:@"image/png"]; } progress:^(NSProgress * _Nonnull uploadProgress) { //打印上传进度 NSLog(@"%lf",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"请求成功"); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败"); }]; } //第二种:是经过url来获取路径,进入沙盒或者系统相册等等 - (void)upload2 { //1.建立管理者对象 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //2.上传文件 NSDictionary *dic = @{@"userName":@"123456"}; NSString *urlString = @"456789"; [manager POST:urlString parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"文件地址"] name:@"fileName" error:nil]; } progress:^(NSProgress * _Nonnull uploadProgress) { NSLog(@"%lf",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"请求成功: %@",responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败: %@",error); }]; }

 

#pragma mark - 下载 - (void)downLoad { //1.建立管理者对象 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //2.肯定请求的URL地址 NSURL *url = [NSURL URLWithString:@""]; //3.建立请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //下载任务 NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) { //打印下载进度 NSLog(@"%lf",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount); } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { //下载地址 NSLog(@"默认下载地址 : %@",targetPath); //设置下载路径,经过沙盒获取缓存地址,最后返回NSURL对象 NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; return [NSURL URLWithString:filePath]; } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { //下载完成调用的方法 NSLog(@"下载完成"); NSLog(@"%@--%@",response,filePath); }]; //开始启动任务 [task resume]; }
相关文章
相关标签/搜索