AFNetworking自我总结

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];
时间: 2024-12-12 02:25:32

AFNetworking自我总结的相关文章

20多岁学习编程晚吗?看看56岁的大叔如何克服自我怀疑学习编程

原文地址:http://mp.weixin.qq.com/s/zzoPGDS5eELxEeO_zfG20w 版权声明 本文首发自微信公共帐号: 学习学习再学习(xiaolai-xuexi) 无需授权即可转载, 甚至无需保留以上版权声明: 转载时请务必注明作者. 我 56 岁了,正在学编程. 为什么?因为我喜欢编程,现在也算得上是老司机了. 但是编程并不简单,学编程很难,不过我还可以接受. 我喜欢沉浸在算法带来的挑战中,也愿意挤出几分钟多进行一次测试,更爱"也许这一次就成功了"之后&qu

UFLDL深度学习教程翻译之自我学习

一.概述 假设我们有足够强大的学习算法,得到较好结果的其中一种最靠谱的方法是给算法提供更多的数据.这验证了在机器学习的那句格言:"有时候获胜的不是谁有最好的算法,而是谁有最多的数据." 也许有人总能得到有标记的数据,但这么做成本很高.特别地,研究人员已经采用极致的工具例如AMT(亚马逊土耳其机器人)来得到大量训练集.尽管拥有大量的人们人工标记的数据相比拥有大量的研究人员的工程性质的特征已经迈进了一步,但还能做的更好.特别地,自我学习以及无监督特征学习的方法是说,如果我们让我们的算法从无

ios AFNetworking 3.0 原码阅读分析 (一)(AFURLRequestSerialization)

本文主要内容是讲AFNetworking中的AFURLRequestSerialization.它主要的作用是在我们要发送一个网络请求的时候帮助我们创NSMutableURLRequest并封装好所需要的参数到NSMutableURLRequest中.那它内部做了些什么,提供了什么功能,使得我们进行网络请求时候变得如此方便.简单.好像我们什么都不用管就能建立一个正确的请求体NSURLRequest.接下来就会一步步揭开它神秘的面纱. 概览 首先看一下在AFURLRequestSerializat

老男孩IT教育在线3期的学习自我介绍与决心书

哈喽,大家好!我叫代少齐,来自北京,学历大专,专业是地理信息系统应用与开发,上次的自我介绍不知道是什么时候了,很感谢老男孩给我这次机会.工作三年了,90后的我刚走出校园时,自信满满,对生活充满了希望.(*^__^*) 嘻嘻--.我的第一份工作干的地图的二次开发,这个行业不是很吃香,干开发的这一年学到了很多知识和经验,有喜有忧.喜是学到很多工作经验和为人处世,忧是做事情比别人慢半拍而且逻辑思维不强,学的很痛苦.正因为这我不得不辞掉开发的工作,后来找了份测试相关的行业,那是第一次接触Linux操作系

AFNetworking 3.0x版本最新特性

AFNetworking是一款在OS X和iOS下都令人喜爱的网络库.为了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持.如果你的项目以前使用过这些API,建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本.本指南将引导您完成这个过程. 本指南是为了引导使用AFNetworking 2.x升级到最新的版本API,以达到过渡的目的,并且解释了新增和更改的设计结构. 新设备要求: iO

AFNetworking发送和接收字符串时报3840错误的解决办法

AFNetworking框架默认请求类型和响应类型都是JSON格式的,在特殊情况下,我们使用字符串形式的时候,就会报3840错误,如何解决呢? 设置请求管理者: // 因为传递过去和接收回来的数据都不是json类型的,所以在这里要设置为AFHTTPRequestSerializer和AFHTTPResponseSerializer mgr.requestSerializer = [AFHTTPRequestSerializer serializer];// 请求 mgr.responseSeri

iOS开发 之 AFNetworking的基本使用

首先下载AFNetworking 然后在需要使用的类中,导入如下2个头文件: #import "AFNetworking.h"//主要用于网络请求方法 #import "UIKit+AFNetworking.h"//里面有异步加载图片的方法 GET请求网络数据方式: -(void)obtainData {     // 启动系统风火轮     [UIApplication sharedApplication].networkActivityIndicatorVisi

腾讯、网易有道和阿里的笔试分享及自我总结

声明:本人Android移动开发岗 腾讯:考的很杂 选择题(25题不定项):考的包括: 编译原理两题, 计算机网络一两题(私网地址), C++若干, IOS开发一两题, 还有二叉树两三题,先后序遍历,求深度 jvm也有一题, 概率论一两题, JavaScript一题, 还有C语言(包括指针数组,数组指针,指针函数之类的)也挺多的 更多的是看程序求输出. 大题: 1,10亿QQ号用Set和Vector两个容器来删除奇数号 2,猴子摘香蕉,一次可以摘一根或两根,求摘50根有几种摘法(斐波那契数列)

AFNetworking imageView button设置图片缓存

如果对AFNetworking 下载的图片不进行缓存,可能会导致每次加载  image图片的时候都会重新 下载图片; 严重浪费资源: AFNetworking有自带的很方便的配置缓存图片的方法: 在 UIKit+AFNetworking中, imageView和Button的类目都可以设置缓存: 方法如下: button [UIButton setSharedImageCache:[UIButton sharedImageCache]]; imageView [UIImageView setSh