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

AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

AFHTTPSessionManager的GET\POST请求

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

代码示例

// GET
- (void)get2
{
// 1.创建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.利用AFN管理者发送请求
NSDictionary *params = @{
@"username" : @"520it",
@"pwd" : @"520it"
}; [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"请求成功---%@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"请求失败---%@", error);
}];
} // POST
- (void)post2
{
// 1.创建AFN管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.利用AFN管理者发送请求
NSDictionary *params = @{
@"username" : @"520it",
@"pwd" : @"520it"
}; [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"请求成功---%@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"请求失败---%@", error);
}];
}

2.AFHTTPRequestOperationManager

创建AFHTTPRequestOperationManager

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

AFHTTPRequestOperationManager的GET\POST请求

// GET
- (NSURLSessionDataTask *)GET:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure // POST请求
- (NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

代码示例

- (void)get
{
// 1.创建AFN管理者
// AFHTTPRequestOperationManager内部包装了NSURLConnection
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 2.利用AFN管理者发送请求
NSDictionary *params = @{
@"username" : @"520it",
@"pwd" : @"520it"
};
[manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"请求成功---%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败---%@", error);
}];
} - (void)post
{
// 1.创建AFN管理者
// AFHTTPRequestOperationManager内部包装了NSURLConnection
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 2.利用AFN管理者发送请求
NSDictionary *params = @{
@"username" : @"520it",
@"pwd" : @"520it"
};
[manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"请求成功---%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败---%@", error);
}];
}

四、AFN文件下载

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

五、AFN序列化

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

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

六、AFN文件上传

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

AFN上传文件代码示例

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

七、监控联网状态

1.AFN监控联网状态

联网状态status

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

示例代码

AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];

// 提示:要监控网络连接状态,必须要先调用单例的startMonitoring方法
[manager startMonitoring]; [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"%d", status);
}];

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

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

①判断联网状态

// 用WIFI
// [wifi currentReachabilityStatus] != NotReachable
// [conn currentReachabilityStatus] != NotReachable // 没有用WIFI, 只用了手机网络
// [wifi currentReachabilityStatus] == NotReachable
// [conn currentReachabilityStatus] != NotReachable // 没有网络
// [wifi currentReachabilityStatus] == NotReachable
// [conn currentReachabilityStatus] == NotReachable

②实时监听网络状态

#import "ViewController.h"
#import "Reachability.h" @interface HMViewController ()
@property (nonatomic, strong) Reachability *conn;
@end @implementation HMViewController - (void)viewDidLoad
{
[super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkState) name:kReachabilityChangedNotification object:nil];
self.conn = [Reachability reachabilityForInternetConnection];
[self.conn startNotifier];
} - (void)dealloc
{
[self.conn stopNotifier];
[[NSNotificationCenter defaultCenter] removeObserver:self];
} - (void)checkNetworkState
{
// 1.检测wifi状态
Reachability *wifi = [Reachability reachabilityForLocalWiFi]; // 2.检测手机是否能上网络(WIFI\3G\2.5G)
Reachability *conn = [Reachability reachabilityForInternetConnection]; // 3.判断网络状态
if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi
NSLog(@"有wifi"); } else if ([conn currentReachabilityStatus] != NotReachable) { // 没有使用wifi, 使用手机自带网络进行上网
NSLog(@"使用手机自带网络进行上网"); } else { // 没有网络 NSLog(@"没有网络");
}
}
@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. bash builtin eval

    1 在开始执行eval后面的命令之前eval主要做了哪些事情 1.1 去掉反斜杠的quoting 比如\$ac_optarg,会变成$ac_optarg. 1.2 去掉单引号的quoting 比如: ...

  2. envoy

    微服务意味着网络更加依赖于服务抽象边界. 随着相互依赖的服务数量日渐增长,系统100%没问题的时间会变少,整个系统经常有部分功能处于降级状态.

  3. 鉴权应用服务器 app客户端 web服务端 安全令牌(SecurityToken)、临时访问密钥(AccessKeyId, AccessKeySecret)

    设置EndPoint和凭证 移动终端是一个不受信任的环境,把AccessKeyId和AccessKeySecret直接保存在终端用来加签请求,存在极高的风险.建议只在测试时使用明文设置模式,业务应用推 ...

  4. apache httpd 2.4 httpd

    This is a wiki containing user-contributed recipes, tips, and tricks for the Apache HTTP Server (aka ...

  5. YTU 1006: Hero In Maze

    1006: Hero In Maze 时间限制: 1000 Sec  内存限制: 64 MB 提交: 72  解决: 22 题目描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人 ...

  6. Python之Split函数

    python中的split()函数用来拆分一个字符串,通过指定的分隔符对字符串进行切割,返回切割后的字符串列表list. split()函数用法: str.split(str=' ',num = st ...

  7. BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图

    BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2, ...

  8. Python进程、线程、协程的对比

    1. 执行过程 每个线程有一个程序运行的入口.顺序执行序列和程序的出口.但是线程不能够独立执行,必须依存在进程中,由进程提供多个线程执行控制.每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该 ...

  9. 使用cgroups限制MongoDB的内存使用

    cgroups,其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU.内存.磁盘输入输出等). 这个项目最早是由Goo ...

  10. Spring--quartz中cronExpression配置说明

    Spring--quartz中cronExpression Java代码   字段      允许值         允许的特殊字符 秒       0-59        , - * / 分     ...