iOS开发-AFNetworking详解

这是一篇AFNetworking的详细解析

使用示例

新建一个AFHTTPSessionManager的manager,然后用manager请求对应网址的信息,回调会调用success的completionHander代码块。

AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];
[manager GET:@"www.baidu.com" 
parameters:nil 
progress:nil 
success:^(NSURLSessionDataTask * _Nonnull task,
id  _Nullable responseObject) {
        NSLog(responseObject);
    } failure:nil];

AFNetworking流程图

Paste_Image.png

  • 调用post请求
- (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters 
progress:(void (^)(NSProgress * _Nonnull))uploadProgress 
success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success 
failure:(void (^)(NSURLSessionDataTask * _Nullable,
 NSError * _Nonnull))failure
  • 新建一个task
- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method 
URLString:(NSString *)URLString 
parameters:(id)parameters 
uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress 
downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) 
downloadProgress 
success:(void (^)(NSURLSessionDataTask *, id))success 
failure:(void (^)(NSURLSessionDataTask *, NSError *))failure
  • 新建一个request
- (NSMutableURLRequest *)requestWithMethod:(NSString *)method 
URLString:(NSString *)URLString 
parameters:(id)parameters 
error:(NSError *__autoreleasing *)error
  • 新建一个dataTask
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request 
uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) 
uploadProgressBlock downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) 
downloadProgressBlock 
completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject
, NSError * _Nullable error))completionHandler
  • 添加delegate
- (void)addDelegateForDataTask:(NSURLSessionDataTask *)dataTask 
uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) 
uploadProgressBlock downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) 
downloadProgressBlock 
completionHandler:(void (^)(NSURLResponse *response
, id responseObject, NSError *error))completionHandler

整体架构

  • AFURLSessionManager的mutableTaskDelegatesKeyedByTaskIdentifier属性,存放着每一个task对应的AFURLSessionManagerTaskDelegate;
  • AFURLSessionManager的NSURLSessionDelegate实现,会调用每个task对应的AFURLSessionManagerTaskDelegate;
  • 设置Task的AFURLSessionManagerTaskDelegate时,用了NSLock,进行多线程同步
  • 任务的调度采用了工厂模式、观察者和代理模式
    • 工厂模式 对于HTTP协议的请求有 AFHTTPRequestSerializer AFJSONRequestSerializer AFPropertyListRequestSerializer 三个都依赖抽象接口AFURLRequestSerialization 对于HTTP协议的响应有 AFHTTPResponseSerializer AFJSONResponseSerializer AFXMLParserResponseSerializer AFXMLDocumentResponseSerializer AFPropertyListResponseSerializer AFImageResponseSerializer AFCompoundResponseSerializer 都依赖抽象接口 AFURLResponseSerialization 符合 开放-封闭原则 对增加新的请求头、响应头是开放的,而且增加新内容不需要修改原内容
    • 观察者模式 对于task的每个生命周期,都会有相应的事件发出 AFNetworkingTaskDidResumeNotification AFNetworkingTaskDidSuspendNotification 对于task用KVO的方式去监听Progress
    • 代理模式 AFURLSessionManagerTaskDelegate 是AF对自己的逻辑封装,同时实现了 NSURLSessionTaskDelegate, NSURLSessionDataDelegate NSURLSessionDownloadDelegate 同时通过实现NSURLSessionDelegate,来接受session级别的事件。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏哈雷彗星撞地球

(译)openURL 在 iOS10中已弃用

翻译自:openURL Deprecated in iOS10 译者:Haley_Wong

11610
来自专栏一“技”之长

从AFNetworking源码分析到应用全解 原

    AFNetworking是iOS/OS开发中常用的一个第三方网络库,可以说它是目前最流行的网络库,但其代码结构其实并不复杂,也可以说非常简洁优美。在AF...

67330
来自专栏iOSer成长记录

AFNetworking 源码阅读(v3.2.1)

33920
来自专栏陈满iOS

iOS开发·第三方网络下载处理框架:AFNetworking网络下载处理(官方文档翻译篇)

它服从<NSURLSessionTaskDelegate>,<NSURLSessionDataDelegate>,<NSURLSessionDownloadDe...

21930
来自专栏iOS122-移动混合开发研究院

BlocksKit初见:一个支持将delegate转换成block的Cocoa库

简介 项目主页: https://github.com/zwaldowski/BlocksKit BlocksKit 是一个开源的框架,对 Cocoa 进行了扩...

224100
来自专栏iOS 开发杂谈

App的生命周期

注意: application:didFinishLaunchingWithOptions:: App 首次启动时调用,一般在这个函数里创建 window 对...

24410
来自专栏一“技”之长

iOS第三方文件压缩框架——Godzippa 原

    Godzippa是iOS开发中常用的一个第三方数据压缩框架,其采用类别的方式,为NSData类与NSFileManager类提供了压缩和解压缩数据的方法...

7910
来自专栏coding...

Objective-c 多线程操作 自定义NSOperation 模拟下载写在前面效果分析代码DEMO地址

使用多线程下载图片,使用内存缓存和磁盘缓存。 这里只为理解NSOperation及其派生类 真要应用到APP中 请下载成熟的第三方库

13060
来自专栏逸鹏说道

AutoFac在项目中的应用

技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github....

36360
来自专栏iOS技术杂谈

iOS网络——AFNetworking AFURLSessionManager源码解析

你要知道的NSURLSession都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本...

43270

扫码关注云+社区

领取腾讯云代金券