AFNetworking

简介

  • 目前国内开发网络应用使用最多的第三方框架
  • 是专为 Mac OS & iOS 设计的一套网络框架
  • 对 NSURLConnection 和 NSURLSession 做了封装
  • 提供有丰富的 API
  • 提供了完善的错误解决方案
  • 使用简单

官网地址

https://github.com/AFNetworking/AFNetworking

学习第三方框架的步骤

  1. 获取框架

     $ git clone https://github.com/AFNetworking/AFNetworking.git
    # 更新框架
    $ git pull
  2. 查看官方文档
  3. 运行演示程序
  4. 建立学习分支
    • 分支是学习第三方框架和入手公司项目的重要手段!
  5. 编写测试程序
  6. 少百度,如果实在困难,可以谷歌

数据格式

请求的数据格式

  • 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 时,一定记住输出: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

小结

  1. 在 AppDelegate 中设置缓存
  2. 在 AppDelegate 中设置网络访问指示器
  3. 继承 AFHTTPSessionManager 创建单例统一管理网络访问
  4. 单例方法中使用了 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自我总结的更多相关文章

  1. AFNetworking之于https认证

    写在开头: 本来这篇内容准备写在AFNetworking到底做了什么?(三)中的,但是因为我想在三中完结这个系列,碍于篇幅所限.并且这一块内容独立性比较强,所以单独拎出来,写成一篇. 本文从源码的角度 ...

  2. AFNetworking 之于 https 认证

    写在开头: 本来这篇内容准备写在AFNetworking到底做了什么?(三)中的,但是因为我想在三中完结这个系列,碍于篇幅所限.并且这一块内容独立性比较强,所以单独拎出来,写成一篇. 本文从源码的角度 ...

  3. 【转】AFNetworking之于https认证

    转自:http://www.cocoachina.com/ios/20161220/18393.html 写在开头: 本来这篇内容准备写在AFNetworking到底做了什么?(三)中的,但是因为我想 ...

  4. BAT面试经验分享——iOS高级开发工程师的自我总结!

    序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了. 今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,随着各大公司秋招的开始,很多小伙伴都行动起来了,我也有幸获得了一份不 ...

  5. 拨开迷雾,找回自我:DDD 应对具体业务场景,Domain Model 到底如何设计?

    写在前面 除了博文内容之外,和 netfocus 兄的讨论,也可以让你学到很多(至少我是这样),不要错过哦. 阅读目录: 迷雾森林 找回自我 开源地址 后记 毫无疑问,领域驱动设计的核心是领域模型,领 ...

  6. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  7. 【原】AFNetworking源码阅读(五)

    [原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...

  8. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

  9. 【原】AFNetworking源码阅读(三)

    [原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...

随机推荐

  1. Http请求和响应报文基础知识

    一 HTTP请求报文(http://en.wikipedia.org/wiki/List_of_HTTP_header_fields) 请求报文由三部分组成:请求行,请求头和请求体. 请求行:请求方法 ...

  2. iOS开发~interface Builder(简称 IB) 界面构建器

    1.interface Builder 设置界面 1.1 是什么? 一个可视化的界面编辑工具软件,在xcode4之后整合到了xcode中 1.2 作用? 通过可视化的界面设置,能够少写或不写代码而完成 ...

  3. automaticallyAdjustsScrollViewInsets的作用

    简单点说就是automaticallyAdjustsScrollViewInsets根据按所在界面的status bar,navigationbar,与tabbar的高度,自动调整scrollview ...

  4. 算法_Longest Palindromic Substring(寻找最长回文字串)

    题目:Given a string S, find the longest palindromic substring in S. You may assume that the maximum le ...

  5. 超级密码(dfs)

    超级密码233 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  6. CodeForces 124B Permutations

    http://codeforces.com/problemset/problem/124/B Description You are given nk-digit integers. You have ...

  7. Cognitive Radio Emergency Networks – Requirements and Design

    2005 IEEE 这是一个典型的Ad hoc场景.紧急情况下的临时自组网络.虽然之前的论文中把它标记为out-of-band global coverage,但这个也是分组的,每个组有个gatewa ...

  8. wordpress教程之函数site_url()、home_url()、bloginfo(‘url’)的区别

    在wordpress插件和主题开发中经常需要获取各种URL路径,wordpress提供了以下集中方法获得URL路径: plugins_url() — 插件目录的 URL (例如:http://www. ...

  9. C语言的本质(32)——C语言与汇编之C语言内联汇编

    用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码.另外,有些平台相关的指令必 ...

  10. Linux Ubuntu download

    下载地址:http://www.ubuntu.com/download/ Ubuntu桌面用户版 符合用户个性的版本