AFHTTPRequestOperation是AFURLConnectionOperation的子类,它用于使用HTTP或者HTTPS协议进行请求。它封装了可接受的状态代码和内容类型的概念,其中状态代码和内容类型决定了请求的成功或失败。
而AFURLConnectionOperation是这样一个类:
@interface AFURLConnectionOperation : NSOperation <NSURLConnectionDelegate, NSURLConnectionDataDelegate, NSSecureCoding, NSCopying>
@property (nonatomic, strong) AFHTTPResponseSerializer <AFURLResponseSerialization> * responseSerializer;
<AFURLResponseSerialization>:AFURLResponseSerialization协议被看作是一个对象,这个协议通过解码数据转换成一个更有用的对象表示。根据服务器响应的细节,它还可以对传入的响应进行额外的数据验证。(很好奇,它验证了些啥?)
下面分别是AFHTTPRequestOperation 类里ResponseSerializer属性的get和set方法:
- (void)setResponseSerializer:(AFHTTPResponseSerializer <AFURLResponseSerialization> *)responseSerializer {
NSParameterAssert(responseSerializer);
[self.lock lock];
_responseSerializer = responseSerializer;
self.responseObject = nil;
self.responseSerializationError = nil;
[self.lock unlock];
}
- (id)responseObject {
[self.lock lock];
if (!_responseObject && [self isFinished] && !self.error) {
NSError *error = nil;
self.responseObject = [self.responseSerializer responseObjectForResponse:self.response data:self.responseData error:&error];
if (error) {
self.responseSerializationError = error;
}
}
[self.lock unlock];
return _responseObject;
}
上面的get方法里AFHTTPResponseSerializer类遵循AFURLResponseSerialization协议,需要实现该协议里的方法(responseObjectForResponse:data:error:);除此之外,AFJSONResponseSerializer、AFXMLParserResponseSerializer、AFXMLDocumentResponseSerializer、AFPropertyListResponseSerializer、AFImageResponseSerializer、AFCompoundResponseSerializer都继承了AFHTTPResponseSerializer类,它们也都遵循AFURLResponseSerialization,通过实现不同的解析方式返回不同的response结果。
下面是完成后的回调,默认放在主线程,如果给completionBlock赋值,会在completionBlock指定的线程中返回response结果:
- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
// completionBlock is manually nilled out in AFURLConnectionOperation to break the retain cycle.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-retain-cycles"
#pragma clang diagnostic ignored "-Wgnu"
self.completionBlock = ^{
if (self.completionGroup) {
dispatch_group_enter(self.completionGroup);
}
dispatch_async(http_request_operation_processing_queue(), ^{
//把这一大段代码放到processing_queue中执行
if (self.error) {
if (failure) {
//把failure(self, self.error)放到主队列中执行,并把主队列放到completionGroup里等待执行。
dispatch_group_async(self.completionGroup ?: http_request_operation_completion_group(), self.completionQueue ?: dispatch_get_main_queue(), ^{
failure(self, self.error);
});
}
} else {
id responseObject = self.responseObject;
if (self.error) {
if (failure) {
//如果是解析错误,默认返回放在主线程,因为默认completionQueue == NULL
dispatch_group_async(self.completionGroup ?: http_request_operation_completion_group(), self.completionQueue ?: dispatch_get_main_queue(), ^{
failure(self, self.error);
});
}
} else {
if (success) {
//默认返回放在主线程,因为默认completionQueue == NULL
dispatch_group_async(self.completionGroup ?: http_request_operation_completion_group(), self.completionQueue ?: dispatch_get_main_queue(), ^{
success(self, responseObject);
});
}
}
}
if (self.completionGroup) {
dispatch_group_leave(self.completionGroup);
}
});
};
#pragma clang diagnostic pop
}