AFNetworking 笔记

759 阅读3分钟

AFURLSessionManager

AFURLSessionManagerAFNetworking这个框架的基类。负责创建并维护管理NSURLSession对象。AFNetworking在2.0版本中,使用的是NSURLConnection, 到了3.0版本以后,就从了Apple,废弃掉了NSURLConnection,用上了NSURLSessionNSURLConnectionNSURLSession的区别为:

NSURLConnection NSURLSession
组成 NSURLRequest, NSURLResponse, NSURLProtol, NSURLCache, NSHTTPCookiestorage, NSULCredentialStorage, NSRULConnection NSURLRequest, NSURLCache, NSURLSession, NSURLSessionConfiguration, NSURLSessionTask
配置信息 共享cookie等信息 可以配置每个session的缓存,协议,cookie以及证书策略,还可以跨程序共享这些信息
数据加载 NSURLConnection NSURLSessionTask, 有三种类型的实体子类: NSURLSessionDataTask, NSURLSessionUploadTaskNSURLSessionDownloadTask,所有的task共享创造者NSURLSession
开始方式 一旦调用了sendAsynchronousRequest:queue:completionHandler:或者是sendSynchronousRequest:returninigResponse:error:就会立即执行任务 创建task后会将task对象返回,允许你进一步配置之后再调用resume方法来运行task
传输字节的参数类型 long long int64_t
文件下载 下载在内存缓存 在临时文件夹

AFURLSessionManager创建了NSURLSession的实例对象,并且遵循<NSURLSessionTaskDelegate>, <NSURLSessionDataDelegate>, <NSURLSessionDownloadDelegate><NSURLSessionDelegate>这四个协议。

如果有需要在子类中重写协议的方法的话,必须在实现中首先调用super的实现。而且AFURLSessionManager基本上将delegate的实现变成了直观的block方法调用。除此之外,当任务完成或者被挂起等操作时,都会有相应的Notification发送出来.

在这个基类中,实现了session对象的创建以及三种类型任务的对象创建。

在创建任务的函数中,跟进度相关的block方法的执行都是在session的队列中,而不是在主队列中来更新任务进度。

在这个类中,使用了_AFURLSessionTaskSwizzling来使用runtime机制,对NSURLSessionTaskstate机制进行kvo检测。需要使用runtime是因为NSURLSessionTask实际上是一个类簇,并且在iOS 7及iOS 8+中的表示并不相同。

AFHTTPSessionManager

AFHTTPSessionManager继承自AFURLSessionManager,提供了一个单例对象。通常在使用中,我们不会直接使用AFURLSessionManager, 而是继承AFHTTPSessionManager类来编写自己的网络层。这种做法基本能满足大部分需求。

AFNetworkReachabilityManager

这个类主要用于监测网络状态,使用之前,需要调用startMonitoring方法开启监测后才能获取到网络状态。

  • 状态
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
  // 未知的主机地址
    AFNetworkReachabilityStatusUnknown          = -1,
  // 主机地址无法访问
    AFNetworkReachabilityStatusNotReachable     = 0,
  // 通过移动网络可达    AFNetworkReachabilityStatusReachableViaWWAN = 1,
  // 通过无线网络可达
    AFNetworkReachabilityStatusReachableViaWiFi = 2,
};
  • 对于网络监测的代码,可以参考苹果提供的样例:developer.apple.com/library/ios…

  • AFNetworkReachabilityManager可以监测当前网络的可达性,也可以获取到指定地址(域名或者ip地址)的可达性

+ (instancetype)manager;
+ (instancetype)managerForDomain:(NSString * )domain;
+ (instancetype)managerForAddress:(const void *)address;
  • ·在监测时,使用的SystemConfiguration这个系统框架提供的SCNetworkReachability提供的方法,将状态监测放到了main runloop的common mode中。在后台队列中,如果网络状态发生变化的话,会通过AFPostReachabilityStatusChange方法将变化添加到主线程上

AFSecurityPolicy

网络安全相关

AFURLRequestSerialization

将请求序列化,将参数转换为query string/entity body,并允许我们设置header信息

  • AFPercentEscapedStringFromString(NSString *string)用于将字符串编码,根据RFC 3986的标准,对传入的字符串进行编码后返回

  • 对于header信息的修改,是在一个并发队列中执行的,当需要设置header的field时,会使用GCD的dispatch_barrier_async来设置barrier,直到field设置完成。

AFURLResponseSerialization

将服务器返回的数据转换为有用的形式(类型)

对于不同类型的content-type都会有相对应类型的序列化操作:

// Base class
AFHTTPResponseSerializer

/**
  - 'application/json'
  - 'text/json'
  - 'text/javascript'
*/
AFJSONResponseSerializer

/**
  将XML响应解码为'NSXMLParser'对象

  - 'application/xml'
  - 'text/xml'
*/
AFXMLParserResponseSerializer

/**
  将XML响应解码为'NSXMLDocument'对象

  - 'application/xml'
  - 'text/xml'
*/
AFXMLDocumentResponseSerializer

/**
  - 'application/x-plist'
*/
AFPropertyListResponseSerializer

/**
  - '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'
*/
AFImageResponseSerializer

关于AFNetworking2.0的,可以参考以下两篇文章:


参考链接