AFNetworking自我总结
AFNetworking
简介
- 目前国内开发网络应用使用最多的第三方框架
- 是专为
Mac OS
&iOS
设计的一套网络框架 - 对
NSURLConnection
和NSURLSession
做了封装 - 提供有丰富的 API
- 提供了完善的错误解决方案
- 使用简单
官网地址
https://github.com/AFNetworking/AFNetworking
学习第三方框架的步骤
- 获取框架
$ git clone https://github.com/AFNetworking/AFNetworking.git
# 更新框架
$ git pull
- 查看官方文档
- 运行演示程序
- 建立学习分支
分支
是学习第三方框架和入手公司项目的重要手段!
- 编写测试程序
- 少百度,如果实在困难,可以谷歌
数据格式
请求的数据格式
- AFURLRequestSerialization
类型 | 说明 |
---|---|
AFHTTPRequestSerializer |
二进制的,默认的 |
AFJSONRequestSerializer |
JSON(POST JSON) RESTful 设计风格需要 |
AFPropertyListRequestSerializer |
PList(POST Plist-开发中几乎不用) |
响应数据格式
AFURLResponseSerialization
类型 | 说明 |
---|---|
AFHTTPResponseSerializer |
HTTP 二进制的 |
AFJSONResponseSerializer |
JSON 默认的 |
AFXMLParserResponseSerializer |
XML Parser 解析器 SAX 解析 |
AFXMLDocumentResponseSerializer |
(Mac OS X) XML DOM |
AFPropertyListResponseSerializer |
PList 几乎不用 |
AFImageResponseSerializer |
图像,不支持 GIF |
AFCompoundResponseSerializer |
组合的 |
数据格式小结
- 大多情况下,都是 JSON,不需要指定
XML 格式
- 如果
SAX
解析,需要指定格式mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
然后利用代理方法解析
如果 DOM 解析,需要指定格式
mgr.responseSerializer = [AFHTTPResponseSerializer serializer];
- 然后利用第三方框架解析
- 如果
图像
- AFN 支持图像缓存,也有对应的分类方法和
SDWebImage
非常像! - 但是:不支持
GIF
- AFN 支持图像缓存,也有对应的分类方法和
提示
- 使用 AFN 时,一定记住输出:
error
- 如果
state code == 200
,就是数据格式错误,针对具体格式进行设置即可
补充
以下连接是移动开发中,常见的 XML 数据格式
http://flash.weather.com.cn/wmaps/xml/china.xml
官方演示程序
AppDelegate
设置缓存
NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];
设置网络访问标示
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
AFAppDotNetAPIClient
提供全局网络访问入口
.h
@interface AFAppDotNetAPIClient : AFHTTPSessionManager
+ (instancetype)sharedClient;
@end
- .m
static NSString * const AFAppDotNetAPIBaseURLString = @"https://api.app.net/";
@implementation AFAppDotNetAPIClient
+ (instancetype)sharedClient {
static AFAppDotNetAPIClient *_sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedClient = [[AFAppDotNetAPIClient alloc] initWithBaseURL:[NSURL URLWithString:AFAppDotNetAPIBaseURLString]];
_sharedClient.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
});
return _sharedClient;
}
@end
小结
- 在
AppDelegate
中设置缓存 - 在
AppDelegate
中设置网络访问指示器 - 继承
AFHTTPSessionManager
创建单例统一管理网络访问 - 单例方法中使用了
BaseURL
,设置后,再访问该服务器,可以直接使用相对路径
代码演练
常规代码演练
- (void)postLogin {
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
NSDictionary *params = @{@"username": @"张三&李四", @"password": @"123"};
[mgr POST:@"http://localhost/login.php" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"POST Login %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];
}
- (void)getLogin2 {
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
NSDictionary *params = @{@"username": @"张三&李四", @"password": @"123"};
[mgr GET:@"http://localhost/login.php" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"GET Login %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];
}
- (void)getLogin1 {
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
[mgr GET:@"http://localhost/login.php?username=zhangsan&password=123" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];
}
- (void)getDemo {
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
[mgr GET:@"http://localhost/demo.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@ %@ %@", responseObject, [responseObject class], [NSThread currentThread]);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];
}
演练小结
- 程序员不需要知道
URL
,直接使用URL
字符串 - 自动实现
JSON
的反序列化 - 网络访问完成的回调,是在主线程,程序员不需要考虑线程间通讯
URL
的参数可以使用 `字典的形式拼接,程序员不在需要考虑
url` 的格式- 程序员不需要考虑百分号转义
- OC中的百分号转义是有缺陷的,特殊字符例如&+= 用OC的百分号转义就不好使了,这时候需要用到AFN中提供的方法
- 程序员不需要知道
HTTP
方法,只需要挑选单词即可!
XML 解析
SAX 解析
tools.responseSerializer = [AFXMLParserResponseSerializer serializer];
DOM 解析
tools.responseSerializer =[AFHTTPResponseSerializer serializer];
多值参数
NetworkTools *tools = [NetworkTools sharedNetworkTools];
NSDictionary *params = @{@"city": @[@"bj", @"sh", @"gz"]};
[tools GET:@"weather.php" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"%@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"%@", error);
}];
PUT 上传 & 进度跟进
- (void)putupload {
NetworkTools *tools = [NetworkTools sharedNetworkTools];
NSString *urlString = @"http://localhost/uploads/321.png";
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"PUT";
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"001.png" withExtension:nil];
NSProgress *progress = nil;
[[tools uploadTaskWithRequest:request fromFile:fileURL progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
NSLog(@"%@ %@", response, responseObject);
}] resume];
// KVO
[progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([object isKindOfClass:[NSProgress class]]) {
NSProgress *progress = object;
NSLog(@"%@ - %@ - %f", progress.localizedDescription, progress.localizedAdditionalDescription, progress.fractionCompleted);
}
}
网络连接状态监听
[tools.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"%zd", status);
switch (status) {
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"没有连接");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WI-FI");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G");
break;
default:
NSLog(@"未知");
break;
}
}];
[tools.reachabilityManager startMonitoring];
AFNetworking自我总结的更多相关文章
- AFNetworking之于https认证
写在开头: 本来这篇内容准备写在AFNetworking到底做了什么?(三)中的,但是因为我想在三中完结这个系列,碍于篇幅所限.并且这一块内容独立性比较强,所以单独拎出来,写成一篇. 本文从源码的角度 ...
- AFNetworking 之于 https 认证
写在开头: 本来这篇内容准备写在AFNetworking到底做了什么?(三)中的,但是因为我想在三中完结这个系列,碍于篇幅所限.并且这一块内容独立性比较强,所以单独拎出来,写成一篇. 本文从源码的角度 ...
- 【转】AFNetworking之于https认证
转自:http://www.cocoachina.com/ios/20161220/18393.html 写在开头: 本来这篇内容准备写在AFNetworking到底做了什么?(三)中的,但是因为我想 ...
- BAT面试经验分享——iOS高级开发工程师的自我总结!
序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了. 今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,随着各大公司秋招的开始,很多小伙伴都行动起来了,我也有幸获得了一份不 ...
- 拨开迷雾,找回自我:DDD 应对具体业务场景,Domain Model 到底如何设计?
写在前面 除了博文内容之外,和 netfocus 兄的讨论,也可以让你学到很多(至少我是这样),不要错过哦. 阅读目录: 迷雾森林 找回自我 开源地址 后记 毫无疑问,领域驱动设计的核心是领域模型,领 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- 【原】AFNetworking源码阅读(五)
[原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...
- 【原】AFNetworking源码阅读(四)
[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...
- 【原】AFNetworking源码阅读(三)
[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...
随机推荐
- iOS 面试基础题
1.UIWindow和UIView和 CALayer 的联系和区别? 答:UIView是视图的基类,UIViewController是视图控制器的基类,UIResponder是表示一个可以在屏幕上响应 ...
- 编写简单的 NT 式驱动程序的加载与卸载工具
写驱动的加载需要用到五个函数: OpenSCManager() CreateService() OpenService() StartService() CloseServiceHandle() 这五 ...
- 求a,b在区间上的公倍数个数
给你两个数 a,b.问你区间 [1,N]中都是有多少个数是a,b的公倍数.当数据很大的时候,遍历肯定会超时.其实,我们可以首先求出 lcm(a,b).因为我们知道(a,b)公倍数都是它最小公倍数的倍数 ...
- Niagara AX之BajaScript资料哪里找
四个步骤:(开篇:多谢陈工!) 1.Services下添加box->boxService: 2.在Apps下添加BajaScriptTutorialsApp: 3.登录用户的Web Profil ...
- mysql中函数DISTINCT,group by,CONCAT及GROUP_CONCAT的使用
一:DISTINCT 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是 ...
- js数组小结
1.js数组使用sort()排序 var a = ["1","12","3","4","0"]; d ...
- Bing必应(Yahoo雅虎)搜索引擎登录网站 - Blog透视镜
Bing必应是微软的搜索引擎,原本是置放在MSN网站上的,微软重新开发并改为新的名子,只要连到官网,登录网站后,过了不久,搜索引擎就会用爬虫,来检索你的网站,等过了一阵子之后,自然就可以找到你的文章. ...
- TF卡座(外焊、内焊、掀盖式、全塑、简易)
TF卡座(外焊.内焊.掀盖 式.全塑.简易
- Linux实现SSH无密码登录(对目录权限的设置非常详细,可以参考一下)
假设服务器IP地址为192.168.1.1,机器名:cluster.hpc.org 客户端IP地址为172.16.16.1,机器名:p470-2.wangrx.sioc.ac.cn 客户端用户yzha ...
- IE input X 去掉文本框的叉叉和密码输入框的眼睛图标
从IE 10开始,type="text" 的 input 在用户输入内容后,会自动产生一个小叉叉(X),方便用户点击清除已经输入的文本对于type="password&q ...