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

CORE(核心):

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

HTTP CLIENT :

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];

示例代码 :

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请求
- (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文件中

    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];
}

AFNetworking你最最最起码要知道的基本使用~的更多相关文章

  1. 英语学习[ZZ]

    本文作者三年间从四级勉强及格到高级口译笔试210,口试232.找工作面试时给其口试的老外考官听了一分钟就说你的英语不用考了.虽不敢说方法一定是最好的,但从现在开始随便谁不要再去找学习资料,每天花两个钟 ...

  2. cocos2d-x 之Scene和Layer

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  3. 前端框架之Vue(9)-组件基础&vue-cli

    组件基础 基本示例 这里有一个 Vue 组件的示例: <!DOCTYPE html> <html lang="en"> <head> <m ...

  4. Android - fragment Manager

    fragment基本使用: http://www.cnblogs.com/qlky/p/5415679.html Fragmeng优点 Fragment可以使你能够将activity分离成多个可重用的 ...

  5. vue基础——组件基础

    一.基本示例 这里有一个Vue组件的示例: // 定义一个名为 button-counter 的新组件 main.js Vue.component('button-counter', { data: ...

  6. vue总结 06组件

    组件基础 基本示例 这里有一个 Vue 组件的示例: // 定义一个名为 button-counter 的新组件Vue.component('button-counter', { data: func ...

  7. 初尝Perl -- 使用aapt给apk软件包批量重命名

    不知道什么是Perl猛戳这个链接 http://zh.wikipedia.org/wiki/Perl     任务:                 随着手机/平板的各方面性能的不断发展(CPU,内存 ...

  8. Fragment-传递参数

    在关Fragment间参数的传递,有两种情况: 第一种情况:同一个container中不同fragment间的参数传递.这种情况一般发生在fragment跳转时,上一个Fragment将参数传递给下一 ...

  9. android10Binder(五)java世界的binder:AndroidFramework

    java世界的binder:AndroidFramework 目录 java世界的binder:AndroidFramework 一.前言 二.SystemServer进程的open.mmap 三.A ...

随机推荐

  1. U盘装系统流程_U启动

    步骤 (已有装机U盘的前提下,没有则参考U启动制作U盘启动盘详细教程) (这里默认已设置了相关开机设置,若没设置则参考怎么用u盘装win7系统(推荐看)中步骤11-13) 按开机键后,不断按F12(有 ...

  2. 微信小程序居中代码

    html页面: { text-align:center; } wxss页面: { width: 100%; height: 100%; display: flex; justify-content: ...

  3. Oracle用户和模式,表空间

    oracle 用户与表空间关系 oracle用户与表空间关系用户=商家表=商品表空间=仓库1. 1个商家能有很多商品,1个商品只能属于一个商家2. 1个商品可以放到仓库A,也可以放到仓库B,但不能同时 ...

  4. elasticsearch对某段时间范围内按时间间隔进行统计

    { "query" : { "constant_score" : { "filter" : { "range" : { ...

  5. 高能福利 |"荐"者有份,有"福"同享

    WeTest 导读 越来越多的开发者加入WeTest大家庭了,感谢大家一直以来的支持,WeTest又有新一步“大福利”赠送了! 即日起,参加WeTest用户推荐有礼活动,推荐者和被推荐者皆可获得福利. ...

  6. 网络基础知识-bps、Bps、pps的区别

    在计算机科学中,bit是表示信息的最小单位,叫做二进制位:一般用0和1表示.Byte叫做字节,由8个位(8bit)组成一个字节(1Byte),用于表示计算机中的一个字符.bit(比特)与Byte(字节 ...

  7. Oracle的集合运算符

    Oracle的集合运算符有并集union.union all,交集intersect,差集minus 先建表myemp,进行集合运算的测试 create table myemp as select * ...

  8. 车架号识别,VIN码识别 助力汽车后市场

    又有一家汽配圈新贵引入了小译家的 车架号识别(VIN码识别)技术 那就是明觉科技 是一个服务于汽车后市场 集数据服务.行业数据挖掘 及“互联网+”为一体的汽配信息协作平台 旗下拥有一款全车零配件信息智 ...

  9. 基于marathon-lb的服务自发现与负载均衡

    参考文档: Marathon-lb介绍:https://docs.mesosphere.com/1.9/networking/marathon-lb/ 参考:http://www.cnblogs.co ...

  10. MySQL-MMM方案

    参考文档: 官方文档:http://mysql-mmm.org/mmm2:guide 本文对mmm方案做简单介绍,并做1个简单的验证. 一.MySQL-MMM方案 1. MMM方案简介 MMM(Mul ...