AFN 框架解析及使用

**放在最前:文章为本人学习随笔,若对您有帮助,不胜荣幸;若有错漏欢迎评论区留言。**

一、框架解析

使用AFNetWorking 也已经几年了,使用起来也顺手,但是最值得我们学习的AFN 结构设计思想,仍然是要努力探究的方向。先让我们来学习下AFN的整体结构是怎样的吧,见图思义:


AFN结构图

1、AFHTTPSessionManager 

负责发送网络请求及相应的处理,其调用栈如下:

- [AFHTTPSessionManager GET:parameters:process:success:failure:]  

- [AFHTTPSessionManager dataTaskWithHTTPMethod:parameters:uploadProgress:downloadProgress:success:failure:] // 返回 NSURLSessionDataTask  *1

-[AFHTTPRequestSerializer requestWithMethod:URLString:parameters:error:] // 返回 NSMutableURLRequest 

    - [AFURLSessionManager dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler:] // 返回 NSURLSessionDataTask *2

    - [NSURLSession dataTaskWithRequest:] // 返回 NSURLSessionDataTask *3

    - [AFURLSessionManager addDelegateForDataTask:uploadProgress:downloadProgress:completionHandler:] - [AFURLSessionManagerTaskDelegate init]

    - [AFURLSessionManager setDelegate:forTask:]

    - [NSURLSessionDataTask resume]

在这里 *1 *2 *3 处返回的是同一个 data task,我们可以看到,在 #3 处调用的方法 即为NSURLSession 的请求回调,我们再调用 - resume 方法执行请求,并在事件执行时通知代理 AFURLSessionManagerTaskDelegate

如上简单一个GET请求示例如下:

[[AFAppDotNetAPIClient sharedClient] GET:@"stream/0/posts/stream/global" parameters:nil progress:nil success:^(NSURLSessionDataTask * __unused task, id JSON) {   

 NSArray *postsFromResponse = [JSON valueForKeyPath:@"data"];         NSMutableArray *mutablePosts = [NSMutableArray arrayWithCapacity:[postsFromResponse count]];       

for (NSDictionary *attributes in postsFromResponse) {

        Post *post = [[Post alloc] initWithAttributes:attributes];         

        [mutablePosts addObject:post];        }     

  if (block) {         

  block([NSArray arrayWithArray:mutablePosts], nil);     

  }

    } failure:^(NSURLSessionDataTask *__unused task, NSError *error) {   

    if (block) {     

      block([NSArray array], error);   

    }    }];

2、AFNetworkReachabilityManager

实时监测网络状态的工具类,另系统自带Reachability 也可

3、AFSecurityPolicy :

网络安全的工具类,主要针对HTTPS服务;

typedef NS_ENUM(NSUInteger,AFSSLPinningMode){                    AFSSLPinningModeNone,                                                       AFSSLPinningModePublicKey,                                           AFSSLPinningModeCertificate};

主要根据 AFSSLPinningMode 设置https请求验证类型,验证底层为系统Security框架;

4、AFURLRequestSerialization:

序列化工具类,封装NSMutableRequest,上传的数据转换成JSON格式

5、AFURLResponseSerialization: 

AFURLResponseSerialization主要负责对网络请求回来的响应报文数据进行反序列化

下面是AFHTTPResponseSerializer的相关属性:

@interface AFHTTPResponseSerializer : NSObject                                                  @property (nonatomic, assign) NSStringEncoding stringEncoding; //文本编码@property (nonatomic, copy, nullable) NSIndexSet *acceptableStatusCodes; //允许的http状态码                                                                                                                  @property (nonatomic, copy, nullable) NSSet *acceptableContentTypes; //允许的content-type类型@end

stringEncoding属性是文本编码方式,用于响应的报文数据反序列化成字符串。acceptableStatusCodes是一个集合,表示客户端可以接受的报文数据的http状态码。acceptableContentTypes是一个集合,表示客户端可以接受的报文数据的content-type类型。

自带的各个解析器

以下解析器都集成自AFHTTPResponseSerializer 的子类不同类型对应不同的解析方法,主要方法:

- (id)responseObjectForResponse:(NSURLResponse *)response

                           data:(NSData *)data

                          error:(NSError *__autoreleasing*)error

AFJSONResponseSerializer

acceptTypes:

 [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];

主要方法:

[NSJSONSerializationJSONObjectWithData:dataoptions:self.readingOptionserror:&serializationError]

AFXMLParserResponseSerializer

acceptTypes: 

 [[NSSet alloc] initWithObjects:@"application/xml",@"text/xml",nil];

主要方法:

[[NSXMLParser alloc] initWithData:data]

AFXMLDocumentResponseSerializer

acceptTypes:

 [[NSSet alloc] initWithObjects:@"application/xml",@"text/xml",nil];

主要方法:

[[NSXMLDocument alloc] initWithData:data options:self.options error:&serializationError];

AFPropertyListResponseSerializer

acceptTypes:

 [[NSSet alloc] initWithObjects:@"application/x-plist", nil];

主要方法:

[NSPropertyListSerialization propertyListWithData:data options:self.readOptions format:NULL error:&serializationError];

AFImageResponseSerializer

acceptTypes:

[[NSSet alloc] initWithObjects:@"image/tiff", @"image/jpeg", @"image/gif", @"image/png", @"image/ico", @"image/x-icon", @"image/bmp", @"image/x-bmp", @"image/x-xbitmap", @"image/x-win-bitmap", nil];

主要方法:

 CoreGraphics框架下 CGImageRefimageRef 、GDataProviderRef

AFCompoundResponseSerializer

混合解析器,初始化方法如下

+ (instancetype)compoundSerializerWithResponseSerializers:(NSArray *)responseSerializers {

    AFCompoundResponseSerializer *serializer = [[self alloc] init];

    serializer.responseSerializers= responseSerializers;

    return serializer;

}

7、UIKit分类

常用分类 有

 UIButton+AFNetworking 、 UIImageView+AFNetworking、UIImage+AFNetworking

二、基本使用

1、POST/GET/DELETE/PATCH/PUT/Download/Upload

1)初始化设置相关

 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];                                                                                             [configuration setTLSMinimumSupportedProtocol:kTLSProtocol12]; //协议类型                  manager=[manager initWithBaseURL:[NSURL URLWithString:urlString] sessionConfiguration:configuration];                                                                                   //设置证书策略                                                                                                                 NSData *certData = [NSData dataWithContentsOfFile:cerPath];                securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];  //AFSSLPinningModeNone        //validatesDomainName 是否需要验证域名,默认为YES;        securityPolicy.validatesDomainName = YES;                securityPolicy.pinnedCertificates = [[NSSet alloc] initWithObjects:certData,nil];          //禁用http响应缓存                                                        manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;                                                      [manager setDataTaskWillCacheResponseBlock:nil];

2) 序列化

manager.requestSerializer = [AFJSONRequestSerializer serializer]; manager.responseSerializer = [AFJSONResponseSerializer serializer];

manager.responseSerializer.acceptableContentTypes =[NSSet setWithObjects:@"application/json",@"application/octet-stream",@"text/plain",@"multipart/form-data",@"text/html,@"text/json", nil];

//语言化设置 [manager.requestSerializersetValue:languageCodeforHTTPHeaderField:@"lang"];

//超时设置

 [manager.requestSerializer setTimeoutInterval:self.requestTimeoutInterval];

发起请求

3、断点续传

断点续传,主要是预先创建好一个空文件,然后边写边提交或下载并且记好最后位置即可;具体可见参考4;

三、图片下载管理机制

AFN 提供了完整的图片下载及缓存机制,

1、AFImageDownloader : 图片下载器,主要通过 AFImageDownloaderMergedTask 类管理下载任务

2、AFAutoPurgingImageCache:图片缓存 ,主要是根据id去写入和取出,写入是通过串行队列和栅栏加锁的形式防止写入的安全性问题。

参考:

1、AFNetworking 概述:https://draveness.me/afnetworking1/

2、AFNetworking 3.1.0 源码解读:https://www.jianshu.com/p/c36159094e24

3、 iOS源码解析—AFNetworking(ResponseSerializer) - 简书

4、 iOS断点续传和后台下载(基于AFNetworking) - 简书

5、AFImageDownloader

6、AFNetworking 3.0 源码解读(七)之 AFAutoPurgingImageCache - 简书

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343