在了解AFN结构之前,先理解NSURLSession是什么

1. NSURLSession

NSURLSession是苹果官方供给的一套URL加载体系(URL Loading System),供给了经过URL获取资源的才能,经过规范https协议或其他自定协议。

该结构首要包括几个部分:

  • URLSession:用来办理一组有关联性的网络传输使命
  • URLSessionTask:一个网络传输使命,比如下载一个数据,需求经过URLSession执行

关联结构如下图所示:

AFN框架学习

NSURLSession的使用也相当简略

AFN框架学习

最简略的使用办法

  1. 经过NSURLSessionshareInstance获取单例目标
  2. 创立一个URLSessionDataTask目标,传入url
  3. 调用resume开端网络请恳求

恳求完结后会进行回调,有两种办法

  1. 在创立URLSessionDataTask办法时传入的completeHandler进行回调
  2. 完成相关的delegate,经过delegate办法回调,参阅下图

AFN框架学习

全体来说,NSURLSession的使用仍是比较简略的,在功能简略时,直接使用没什么问题,但当事务杂乱的时候,必然需求进行一些封装,AFNetworking的出现就供给了更丰厚的接口规划和杰出的扩展才能。

2. AFNetworking

2.1 有哪些特点?

AFNetworking结构十分强壮,它基于NSURLSession结构封装,其特点如下:

  • 体系接口封装:封装了与session、task创立、交互等细节
  • 使用方便:使用者仅经过一次办法调用即可完结一次网络恳求调用
  • 可扩展性:可扩展的恳求封装和回包封装
  • 丰厚的接口规划
    • 供给告诉、block等多种形式的回调
    • 对HTTP恳求的封装
  • 对UIKit进行扩展

2.2 全体架构规划

类图

AFNetworking的全体架构比较简略,最核心的类就是AFURLSessionManager,可以先看下全体类图:

AFN框架学习

要害类阐明

  • AFURLSessionManager
    • 内部创立和办理NSURLSession目标,完成了NSURLSession的相关delegate回调,根据不同的task找到对应的delegate处理后续逻辑
    • 对外暴露了创立dataTask的一系列接口,用于使用者进行网络恳求,使用者首要关注NSURLRequest的创立和回调block的完成
  • AFHTTPSessionManager
    • AFURLSessionManager的子类,首要意图是方便构造HTTP恳求,如GET、POST等,这个接口关于使用http协议拜访的使用者会更方便一些
  • AFURLSessionManagerTaskDelegate
    • 在AFURLSessionManager内部完成,首要是用于与内部所创立的task绑定,记载恳求进程中的进展、数据等,最后回调到使用者
  • AFURLResponseSerialization
    • 回包序列化协议,供给仅有接口responseObject,经过传入response、data、error目标,解析成对应的数据
    • 完成类首要以数据维度区别,例如解析json数据、解析XML数据、解析图片数据
  • AFURLRequestSerialization
    • 恳求序列化目标,供给仅有接口requestBySerializingRequest:withParameters:error,用于创立一个恳求包括了指定参数的request
    • 它的完成类AFHTTPRequestSerializer供给了HTTP恳求头中常用的一些参数设置,例如是否允许蜂窝网络、缓存策略等,使用者可以经过参数快速修改http恳求头中的数据,以及经过接口parameters供给自定义的参数
    • sessionManager持有该目标,使用者可自行完成该接口从而完成不同的行为策略

时序图

AFN框架学习

恳求创立的进程:

  1. 调用httpSessionManager的GET接口,开端触发协议恳求
  2. httpSessionManager内部会经过requestSerializer创立一个request对,在调用基类的dataTask接口获取一个dataTask
  3. 基类urlSessionManager经过内部的session目标创立dataTask,一起会创立一个对应的taskDelegate,将task与taskDelegate绑定起来,返回dataTask
  4. 使用者调用resume开端恳求流程

恳求回包后流程:

  1. 恳求回来后,首先由session目标经过delegate回调到urlSessionManager中
  2. urlSessionManager收到delegate后,会经过block回调到使用者,一起也会找到task对应的taskDelegate,处理相关逻辑,如更新进展、数据更新
  3. 当收到didComplete回调后,taskDelegate会经过responseSerializer处理回包数据,转换成对应的格式,最终经过最开端传进来的completeBlock回调到上层

小结

全体来说,AFN的代码结构规划不杂乱,其中一些规划奇妙之处:

  1. 经过RequestSerialization和ResponseSerialization策略形式,可以让我们十分简单操控恳求头的生成和回包的处理
  2. taskDelegate和task绑定的机制,将不同task的事件处理隔脱离

一起,虽然全体结构很简略,但AFN作为一个广受好评的开源结构,其代码完成考虑的十分全面,从多线程的处理、接口规划、一些根本恳求serializaer类比如JSON、XML的完成、UIKIt的扩展等,根本覆盖了日常开发使用的方方面面,足以见得其用心之处。

在具体到比较杂乱的事务场景的使用,可以进行一定程度的封装,比如继承AFHttpSessionManager,将恳求头的默认参数如全局共用的UserAgent、通用域名等封装起来,以及一些根本的日志、上报等才能封装,可以让事务开发更方便简略。