AFN基本使用
2016-10-13 本文已影响345人
彼岸的黑色曼陀罗
AFN基本使用
简介
- 框架结构
- NSURLSession
- NSURLSessionManager对NSURLSession的封装
- AFHTTPSessionManager会话管理者
- 序列化处理Serialization
- AFURLRequestSerilization请求
- AFURLResponseSerilization响应
- 扩展功能
- AFSecurityPolicy安全
- AFNetworkReachabilityManager监听
- UIKit+AFNetworking
- 下载缓存图片UIImageView+AFNetworking
- 思考:这个和SDWebImage有什么区别呢?
- 很多好用的分类
- 下载缓存图片UIImageView+AFNetworking
- NSURLSession
GET请求
- 创建会话管理者
- [AFHTTPSessionManager manager]
- 创建字典保存参数
- 发送请求
- [manager GET:parameters:progress:{}success:{}failure:^{}]
- 参数一:请求路径不包含参数,类型是NSString
- 参数二:参数,用字典保存参数
- 参数三:进度回调,发送GET请求不需要进度信息,nil
- 参数四:网络请求成功之后的回调
- dataTask:请求任务本身
- task.response是响应头
- responseObject:不是响应头,是响应体,内部已经完成了反序列化处理 (已经把JSON转为了OC对象了)
- dataTask:请求任务本身
- 参数五:网络请求失败之后的回调
- task:请求任务
- error:错误信息
- [manager GET:parameters:progress:{}success:{}failure:^{}]
POST请求
- 创建会话管理者
- [AFHTTPSessionManager manager]
- 创建字典保存参数
- 发送请求
- [manager POST:parameters:progress:{}success:{}failure:^{}]
- 参数一:请求路径不包含参数,类型是NSString
- 参数二:参数,用字典保存参数
- 参数三:进度回调,发送GET请求不需要进度信息,nil
- 参数四:网络请求成功之后的回调
- dataTask:请求任务本身
- task.response是响应头
- responseObject:不是响应头,是响应体,内部已经完成了反序列化处理 (已经把JSON转为了OC对象了)
- dataTask:请求任务本身
- 参数五:网络请求失败之后的回调
- task:请求任务
- error:错误信息
- [manager POST:parameters:progress:{}success:{}failure:^{}]
使用AFN实现文件下载
-
创建会话管理者
- [AFHTTPSessionManager manager]
-
确定请求路径
-
创建请求对象
-
下载
- [manager downloadTaskWithRequest:progress:destination:completionHandler:
- 参数一:请求对象
- 参数二:进度回调
- NSProgress
- 计算进度
- downloadProgress.completedUnitCount/downloadProgress.totalUnitCount;
- 参数三:destination做URL处理的回调,告诉下载完之后文件写到哪里 ,内部自动做了剪切处理
- targetPath:文件下载到沙盒中的临时路径
- response响应头信息
- 返回值:告诉AFN文件应该剪切到什么地方
- 怎么把路径转为URL?
- [NSURL fileURLWithString:]
- 参数四:完成之后的回调
- filePath:就是文件最终保存的位置
- [manager downloadTaskWithRequest:progress:destination:completionHandler:
-
执行任务
- [downloadTask resume];
-
优点:
- 通过block块集成了下载进度
- 内部完成了文件剪切处理
使用AFN实现文件上传
- 不用拼接了
- 创建会话管理者
- 发送POST请求上传文件
- [manager POST:parameters:constructingBodyWithBlock:progress:success:failure:]
- 参数一:请求路径
- 参数二:非文件参数,用字典来传
- 参数三:block块,处理要上传的文件的
- fromData:遵守AFMultipartFormData协议
- append有些方法不能用
- 方式一:appendPartWithFileData:name:fileName:mimeType:
- 参一:要上传的文件数据
- 参二:由后台接口规定的file
- 参三:文件上传到服务器之后,以什么名称保存
- 参四:文件的二进制数据类型(四种方法获得)image/png
- 方式二:appendPartWithFileURL:name:filename:mimeType:error:
- 参一:fileURLWithPath:
- 参二:file
- 参三:文件上传到服务器以什么名称保存
- 参四:文件的二进制数据
- 方式三:appendPartWithFileURL:name:error:
- 内部实现
- 文件名称是拿到文件路径的最后一个节点
- C语言方法获得mimeType的方法获得mimeType
- 内部实现
- fromData:遵守AFMultipartFormData协议
- 参数四:进度回调
- 进度:当前已经完成的/总大小
- 参数五:成功之后的回调
- responseObject:响应体,内部把JSON数据转为了OC对象
- 参数六:失败之后的回调
AFN使用技巧
- 封装网络请求工具类
- 工具类依赖AFN
- 控制器里面发送网络请求的代码用工具类来实现
- 封装思想
AFN序列化处理
-
创建会话管理者
- [AFHTTPSessionManager manager]
-
创建字典保存参数
-
发送请求
- [manager GET:parameters:progress:{}success:{}failure:^{}]
-
问题一:如果服务器返回的不是JSON数据,而是XML数据怎么处理?
- 该请求服务器返回的是XML数据,而AFN默认以JSON的方式来处理XML数据
- 解决:
- 如果返回的数据是xml,那么应该修改对响应的处理方式为XML
- manager.responserSerilizer = [AFXMLEParserResponseSerializer serializer]
- 创建XML解析器
- (NSXMLParser *)responseObject;
- 设置代理:parser.delegate = self
- 开始解析[parser parse]
- 创建XML解析器
- 遵守协议/实现代理方法didStartElement:
-
问题二:如果服务器返回的既不是JSON也不是XML怎么办?比如对图片发请求(二进制数据)
- 默认以JSON方式处理
- 请求失败,怎么解决
- 如果服务器返回的数据既不是JSON也不是XML,那么就设置为HTTP的解析方式
- manager.responserSerilizer = [AFHTTPResponseSerializer serializer]
- imageWithData:
-
问题三:如果请求的不是图片,而是网页怎么办?
- 比如对百度发请求
- 既不是JSON也不是XML使用 AFHTTPResponseSerializer
-
问题四:以JSON的方式传参数
- 之前的处理方式:字典
- manager.requestSerializer = [AFJSONRequestSerializer serializer]
NSURLSession和NSURLConnection对比
- NSURLSession支持http2.0协议 ios9.0之后
- NSURLSession在处理下载任务的时候,可以直接把数据下载到沙盒里面
- NSURLSession支持后台下载|上传
- 同一个NSURLSession发送多个请求,只需要建立一次连接(复用TCP)
- NSURLSession提供了全局的session并且可以统一配置,使用更加方便
- NSURLSession下载的时候是多线程异步处理的,效率更高
总结
- 文件下载
- NSURLSessionDataTask - 离线断点下载(断点续传)
- NSURLSessionDownloadTask -- 缺点:无法离线断点下载
- 文件上传
- AFN基本使用
- GET|POST
- 下载|上传
- 工具类|序列化
- NSURLSession|NSURLConnection对比
AFN监测网络状态改变
- 网络状态改变
- 3G/Wifi的切换
- AFNetworkReachabilityManager
- 创建一个网络状态监听管理者
- AFNetworkReachabilityManager sharedManager
- 监听状态改变
-
[manager setReachabilityStatusChangeBlock:^{}]
- status:
- Unkown:网络状态未知
- NotReachable:没有网络
- ViaWWAN:蜂窝网络
- ViaWiFi :wifi
- status:
-
开启网络状态监听者
- startMonitoring真机演示
- iTools
- 以前可以通过iTools拿到应用,对应用做一些操作,现在要拿到应用的数据要花钱,拿不到应用的包
- 我的iphone应用
- finder中显示 .ipa
- 归档实用工具打开,可以拿到图片数据,显示包内容
- 开发中,需要提测,提测的时候测试部门一般会提供一些测试机,提测的时候,怎么把项目运行到测试机上呢?
- 提测的时候会要求存档,打包成ipa包,用iTools安装
-