AFNetworking到底帮我们做了那些事情呢?
这得先从NSURLConnection说起,NSURLConnection提供了
+ (void)sendAsynchronousRequest:(NSURLRequest*) request
queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse* __nullable response, NSData* __nullable data, NSError* __nullable connectionError)) handler;
方法来给我们发送请求,这个请求是在主线程发送的,请求发出后,如果用户一直在操作UI上下滑动屏幕,那在滑动结束前是不会执行回调函数的。苹果一直把动画效果性能放在第一位,估计这也是苹果提升UI动画性能的手段之一。
所以AFNetworking 创建了一条常驻线程专门处理所有请求的回调事件。网络请求回调处理完,组装好数据后再给上层调用者回调,这时候回调是抛回主线程的,因为主线程是最安全的,使用者可能会在回调中更新UI,在子线程更新UI会导致各种问题,一般使用者也可以不需要关心线程问题。
AFURLConnectionOperation意义
那么AFURLConnectionOperation类型的意义就是这样的:封装了底层的NSURLConnection类型,改写成一个可以异步执行的NSOperation,提供执行(包括取消和暂停)和执行状态的接口。通过AFURLConnectionOperation的属性来获取整个操作的结果,如responseData, responseString, error属性等。最后还可以通过进度回调来获取执行过程中的进度信息。
AFHTTPRequestOperation意义
AFHTTPRequestOperation类型直接继承上面的AFURLConnectionOperation类型。其意义是在AFURLConnectionOperation类型上,加入了偏向HTTP的处理,如对于整个HTTP操作成功的判断,和暂停和继续处理等。
1. 关于操作的成功判定
核心是两个数据,一个是NSIndexSet类型的acceptableStatusCodes代表可以被认为算成功的HTTP返回码,默认就是200-299。另一个数据是NSSet类型的acceptableContentTypes。也就是需要的MIME类型。
有了这两个数据,AFHTTPRequestOperation就可以判断整个操作是否成功。于是AFHTTPRequestOperation又加入了另一个重要的方法:
- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;