AFN

一、什么是AFN

二、AFN结构

  • NSURLConnection

    • AFURLConnectionOperation
    • AFHTTPRequestOperation
    • AFHTTPRequestOperationManager(封装了常用的 HTTP 方法)
      • 属性

        • baseURL :AFN建议开发者针对 AFHTTPRequestOperationManager 自定义个一个单例子类,设置 baseURL, 所有的网络访问,都只使用相对路径即可
        • requestSerializer :请求数据格式/默认是二进制的 HTTP
        • responseSerializer :响应的数据格式/默认是 JSON 格式
        • operationQueue
        • reachabilityManager :网络连接管理器
      • 方法
        • manager :方便创建管理器的类方法
        • HTTPRequestOperationWithRequest :在访问服务器时,如果要告诉服务器一些附加信息,都需要在 Request 中设置
        • GET
        • POST
  • NSURLSession

    • AFURLSessionManager
    • AFHTTPSessionManager(封装了常用的 HTTP 方法)
      • GET
      • POST
      • UIKit + AFNetworking 分类
      • NSProgress :利用KVO
  • 半自动的序列化&反序列化的功能

    • AFURLRequestSerialization :请求的数据格式/默认是二进制的
    • AFURLResponseSerialization :响应的数据格式/默认是JSON格式
  • 附加功能

    • 安全策略

      • HTTPS
      • AFSecurityPolicy
    • 网络检测
      • 对苹果的网络连接检测做了一个封装
      • AFNetworkReachabilityManager

三、AFN基本使用

1.AFHTTPSessionManager

  • 是AFN中最重要的对象之一
  • 封装了HTTP请求的常见处理
  • GET\POST请求
  • 解析服务器的响应数据

创建AFHTTPSessionManager

  1. AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

AFHTTPSessionManager的GET\POST请求

  1. // GET请求
  2. /*
  3. http://120.25.226.186:32812/login?username=520it&pwd=520it
  4. 第一个参数: 请求的地址 http://120.25.226.186:32812/login
  5. 第二个参数: 请求的参数 username=520it&pwd=520it
  6. 第三个参数: 请求成功的回调
  7. 第四个参数: 请求失败的回调
  8. 只要利用AFN发送请求, 如果服务器返回的是JSON数据, 那么AFN会自动将JSON转会成OC对象返回给我们
  9. */
  10. - (NSURLSessionDataTask *)GET:(NSString *)URLString
  11. parameters:(id)parameters
  12. success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
  13. failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
  14. // POST请求
  15. - (NSURLSessionDataTask *)POST:(NSString *)URLString
  16. parameters:(id)parameters
  17. success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
  18. failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

代码示例

  1. // GET
  2. - (void)get2
  3. {
  4. // 1.创建AFN管理者
  5. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  6. // 2.利用AFN管理者发送请求
  7. NSDictionary *params = @{
  8. @"username" : @"520it",
  9. @"pwd" : @"520it"
  10. };
  11. [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
  12. NSLog(@"请求成功---%@", responseObject);
  13. } failure:^(NSURLSessionDataTask *task, NSError *error) {
  14. NSLog(@"请求失败---%@", error);
  15. }];
  16. }
  17. // POST
  18. - (void)post2
  19. {
  20. // 1.创建AFN管理者
  21. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  22. // 2.利用AFN管理者发送请求
  23. NSDictionary *params = @{
  24. @"username" : @"520it",
  25. @"pwd" : @"520it"
  26. };
  27. [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
  28. NSLog(@"请求成功---%@", responseObject);
  29. } failure:^(NSURLSessionDataTask *task, NSError *error) {
  30. NSLog(@"请求失败---%@", error);
  31. }];
  32. }

2.AFHTTPRequestOperationManager

创建AFHTTPRequestOperationManager

  1. // 1.创建AFN管理者
  2. // AFHTTPRequestOperationManager内部包装了NSURLConnection
  3. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

AFHTTPRequestOperationManager的GET\POST请求

  1. // GET
  2. - (NSURLSessionDataTask *)GET:(NSString *)URLString
  3. parameters:(id)parameters
  4. success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
  5. failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
  6. // POST请求
  7. - (NSURLSessionDataTask *)POST:(NSString *)URLString
  8. parameters:(id)parameters
  9. success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
  10. failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

代码示例

  1. - (void)get
  2. {
  3. // 1.创建AFN管理者
  4. // AFHTTPRequestOperationManager内部包装了NSURLConnection
  5. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  6. // 2.利用AFN管理者发送请求
  7. NSDictionary *params = @{
  8. @"username" : @"520it",
  9. @"pwd" : @"520it"
  10. };
  11. [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
  12. NSLog(@"请求成功---%@", responseObject);
  13. } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
  14. NSLog(@"请求失败---%@", error);
  15. }];
  16. }
  17. - (void)post
  18. {
  19. // 1.创建AFN管理者
  20. // AFHTTPRequestOperationManager内部包装了NSURLConnection
  21. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  22. // 2.利用AFN管理者发送请求
  23. NSDictionary *params = @{
  24. @"username" : @"520it",
  25. @"pwd" : @"520it"
  26. };
  27. [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
  28. NSLog(@"请求成功---%@", responseObject);
  29. } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
  30. NSLog(@"请求失败---%@", error);
  31. }];
  32. }

四、AFN文件下载

  1. // 执行下载文件的方法,可以监控下载进度
  2. - (void)downLoadMonitor
  3. {
  4. // 1.创建网络管理者
  5. // AFHTTPSessionManager 基于NSURLSession
  6. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  7. // 2.利用网络管理者下载数据
  8. NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"]];
  9. /*
  10. destination
  11. - targetPath: 系统给我们自动写入的文件路径
  12. - block的返回值, 要求返回一个URL, 返回的这个URL就是剪切的位置的路径
  13. completionHandler
  14. - url :destination返回的URL == block的返回的路径
  15. */
  16. /*
  17. @property int64_t totalUnitCount; 需要下载文件的总大小
  18. @property int64_t completedUnitCount; 当前已经下载的大小
  19. */
  20. NSProgress *progress = nil;
  21. NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
  22. NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
  23. NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
  24. return [NSURL fileURLWithPath:path];
  25. } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
  26. NSLog(@"%@",filePath.absoluteString);
  27. }];
  28. /*
  29. 要跟踪进度,需要使用 NSProgress,是在 iOS 7.0 推出的,专门用来跟踪进度的类!
  30. NSProgress只是一个对象!如何跟踪进度!-> KVO 对属性变化的监听!
  31. @property int64_t totalUnitCount; 总单位数
  32. @property int64_t completedUnitCount; 完成单位数
  33. */
  34. // 给Progress添加监听 KVO
  35. [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];
  36. // 3.启动任务
  37. [downTask resume];
  38. }
  39. // 收到通知调用的方法
  40. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(NSProgress *)object change:(NSDictionary *)change context:(void *)context
  41. {
  42. NSLog(@"%f",1.0 * object.completedUnitCount / object.totalUnitCount);
  43. // 回到主队列刷新UI
  44. dispatch_async(dispatch_get_main_queue(), ^{
  45. self.progress.progress = 1.0 * object.completedUnitCount / object.totalUnitCount;
  46. });
  47. }

五、AFN序列化

  • 默认是JSON数据,接收类型是JSON

    • 如果接收的类型和返回的类型不匹配会报错
  1. // 1.创建AFN管理者
  2. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  3. // 默认请求二进制
  4. // 默认响应是JSON
  5. // 告诉AFN,支持接受 text/xml 的数据
  6. // [AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet setWithObject:@"text/xml"];
  7. // 告诉AFN如何解析数据
  8. // 告诉AFN客户端, 将返回的数据当做JSON来处理,默认的是以JSON处理
  9. // manager.responseSerializer = [AFJSONResponseSerializer serializer];
  10. // 告诉AFN客户端, 将返回的数据当做XML来处理
  11. // manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
  12. // 告诉AFN客户端, 将返回的数据当做而进行来数据 (服务器返回什么就是什么)
  13. manager.responseSerializer = [AFHTTPResponseSerializer serializer];

六、AFN文件上传

  1. // formData: 专门用于拼接需要上传的数据
  2. - (NSURLSessionDataTask *)POST:(NSString *)URLString
  3. parameters:(id)parameters
  4. constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
  5. success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
  6. failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

AFN上传文件代码示例

  1. // 1.创建网络管理者
  2. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  3. // 2.利用网络管理者上传数据
  4. NSDictionary *dict = @{@"username":@"Syl"};
  5. // formData: 专门用于拼接需要上传的数据
  6. [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:
  7. ^void(id<AFMultipartFormData> formData) {
  8. /*
  9. Data: 需要上传的数据
  10. name: 服务器参数的名称
  11. fileName: 文件名称
  12. mimeType: 文件的类型
  13. */
  14. UIImage *image =[UIImage imageNamed:@"minion_02"];
  15. NSData *data = UIImagePNGRepresentation(image);
  16. [formData appendPartWithFileData:data name:@"file" fileName:@"abc.png" mimeType:@"image/png"];
  17. /*
  18. NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/CertificateSigningRequest.certSigningRequest"];
  19. // 任意的二进制数据MIMEType application/octet-stream
  20. // [formData appendPartWithFileURL:url name:@"file" fileName:@"abc.cer" mimeType:@"application/octet-stream" error:nil];
  21. [formData appendPartWithFileURL:url name:@"file" error:nil];
  22. */
  23. } success:^void(NSURLSessionDataTask * task, id responseObject) {
  24. // 请求成功
  25. NSLog(@"请求成功 %@", responseObject);
  26. } failure:^void(NSURLSessionDataTask * task, NSError * error) {
  27. // 请求失败
  28. NSLog(@"请求失败 %@", error);
  29. }];

七、监控联网状态

1.AFN监控联网状态

联网状态status

  1. // 2.设置监听
  2. /*
  3. AFNetworkReachabilityStatusUnknown = -1, 未识别
  4. AFNetworkReachabilityStatusNotReachable = 0, 未连接
  5. AFNetworkReachabilityStatusReachableViaWWAN = 1, 3G
  6. AFNetworkReachabilityStatusReachableViaWiFi = 2, wifi
  7. */

示例代码

  1. AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
  2. // 提示:要监控网络连接状态,必须要先调用单例的startMonitoring方法
  3. [manager startMonitoring];
  4. [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
  5. NSLog(@"%d", status);
  6. }];

2.Reachability监控联网状态苹果提供,导入这两个类使用

  1. // 1.检测wifi状态
  2. Reachability *wifi = [Reachability reachabilityForLocalWiFi];
  3. // 2.检测手机是否能上网络(WIFI\3G\2.5G)
  4. Reachability *conn = [Reachability reachabilityForInternetConnection];
  5. // 3.判断网络状态
  6. if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi
  7. NSLog(@"有wifi");
  8. } else if ([conn currentReachabilityStatus] != NotReachable) { // 没有使用wifi, 使用手机自带网络进行上网
  9. NSLog(@"使用手机自带网络进行上网");
  10. } else { // 没有网络
  11. NSLog(@"没有网络");
  12. }

①判断联网状态

  1. // 用WIFI
  2. // [wifi currentReachabilityStatus] != NotReachable
  3. // [conn currentReachabilityStatus] != NotReachable
  4. // 没有用WIFI, 只用了手机网络
  5. // [wifi currentReachabilityStatus] == NotReachable
  6. // [conn currentReachabilityStatus] != NotReachable
  7. // 没有网络
  8. // [wifi currentReachabilityStatus] == NotReachable
  9. // [conn currentReachabilityStatus] == NotReachable

②实时监听网络状态

  1. #import "ViewController.h"
  2. #import "Reachability.h"
  3. @interface HMViewController ()
  4. @property (nonatomic, strong) Reachability *conn;
  5. @end
  6. @implementation HMViewController
  7. - (void)viewDidLoad
  8. {
  9. [super viewDidLoad];
  10. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkState) name:kReachabilityChangedNotification object:nil];
  11. self.conn = [Reachability reachabilityForInternetConnection];
  12. [self.conn startNotifier];
  13. }
  14. - (void)dealloc
  15. {
  16. [self.conn stopNotifier];
  17. [[NSNotificationCenter defaultCenter] removeObserver:self];
  18. }
  19. - (void)checkNetworkState
  20. {
  21. // 1.检测wifi状态
  22. Reachability *wifi = [Reachability reachabilityForLocalWiFi];
  23. // 2.检测手机是否能上网络(WIFI\3G\2.5G)
  24. Reachability *conn = [Reachability reachabilityForInternetConnection];
  25. // 3.判断网络状态
  26. if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi
  27. NSLog(@"有wifi");
  28. } else if ([conn currentReachabilityStatus] != NotReachable) { // 没有使用wifi, 使用手机自带网络进行上网
  29. NSLog(@"使用手机自带网络进行上网");
  30. } else { // 没有网络
  31. NSLog(@"没有网络");
  32. }
  33. }
  34. @end

iOS----轻松掌握AFN网络顶级框架的更多相关文章

  1. AFN 处理网络哪些事(轻松掌握AFN网络顶级框架)

    AFN 一.什么是AFN 全称是AFNetworking,是对NSURLConnection的一层封装 虽然运行效率没有ASI高,但是使用比ASI简单 在iOS开发中,使用比较广泛 AFN的githu ...

  2. 封装好的AFN网络请求框架和MBProgress

    demo:https://github.com/IMCCP/CCPAFNNetworking(收藏下来)

  3. 李洪强iOS经典面试题142-第三方框架及其管理

    李洪强iOS经典面试题142-第三方框架及其管理   第三方框架及其管理 使用过CocoaPods吗?它是什么?CocoaPods的原理? CocoaPod是一个第三方库的管理工具,用来管理项目中的第 ...

  4. iOS开发系列—Objective-C之Foundation框架

    概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么这个对象到底 ...

  5. Volley网络请求框架的基本用法

    备注: 本笔记是参照了 http://blog.csdn.net/ysh06201418/article/details/46443235  学习之后写下的 简介:  Volley是google官网退 ...

  6. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

  7. 李洪强iOS下的实际网络连接状态检测

    iOS下的实际网络连接状态检测 序言 网络连接状态检测对于我们的iOS app开发来说是一个非常通用的需求.为了更好的用户体验,我们会在无网络时展现本地或者缓存的内容,并对用户进行合适的提示.对绝大部 ...

  8. 赢友网络通用框架V10.0.0(WinuAppSoft) 基础框架设计表

    /* * 版权所有:赢友网络(http://www.winu.net/) * 开发人员:新生帝(JsonLei) * 设计名称:赢友网络通用框架V10.0.0(WinuAppSoft) * 设计时间: ...

  9. 网络通讯框架MINA和XSCOCKET的简单比较

    http://www.blogjava.net/ghostdog/archive/2008/06/10/MinaVsXsocket.html实在无聊,考虑把当前应用的通讯模式由http移植为socke ...

随机推荐

  1. 局域网内PC通过笔记本共享上网

    现实:PC.笔记本都通过网线接在局域网内,局域网无法上网:笔记本有无线网卡,可连WIFI上网. 现在想让PC通过笔记本来共享上网. 步骤: 1.笔记本开启DHCP.方法是开启"服务" ...

  2. Codeforces Round #419 (Div. 1) C. Karen and Supermarket 树形DP

    C. Karen and Supermarket     On the way home, Karen decided to stop by the supermarket to buy some g ...

  3. 怎样快速刪除Word中超链接?

    有时我们从网上down了一些资料,存到Word文档里,会发现一些文字和图片带有超链接.这其实是Word自动修改功能引起的麻烦,那么,有什么办法可以把这些超链接快速批量删掉吗? 步骤/方法 1 按键盘上 ...

  4. linux losetup

    1 losetup命令的通用格式 losetup loopdev file loopdev可以看出时一个仿真设备,它本身是没有存储空间的,这个命令的作用就是将file作为它的存储空间. 一旦连接成功, ...

  5. java中abstract和interface的區別(轉)

    (一)概述    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存 在,才赋予了Java强大的 面向对象能力.abstract ...

  6. android:json解析的两个工具:Gson和Jackson的使用小例子

    1.简介 json是android与服务器通信过程中常用的数据格式,例如,如下是一个json格式的字符串: {"address":"Nanjing"," ...

  7. Ural2040:Palindromes and Super Abilities(离线&manecher算法)

    Dima adds letters s1, …, sn one by one to the end of a word. After each letter, he asks Misha to tel ...

  8. uCos-III移植到STM32F10x

    最近在百度上看了uCOS-III 的介绍后,诸多功能有很大的提升和改进,感觉有必要升级一下开发环境.百度介绍:http://baike.baidu.com/view/8531313.htm 环境: S ...

  9. math.floor()函数的用法

    floor() 返回数字的下舍整数. 语法 以下是 floor() 方法的语法: import math math.floor( x ) 注意:floor()是不能直接访问的,需要导入 math 模块 ...

  10. 13_传智播客iOS视频教程_OC程序的编译链接

    C程序的编译.链接.执行怎么来的?在.C文件里面写上符合C语言部分的源代码.OC也是一样的.记住:OC程序的后缀名是.m. 为什么要链接?第一个.o的目标文件里面它启动不了.因为它没有启动代码我们要加 ...