美文网首页
AF学习笔记二

AF学习笔记二

作者: 富有的心 | 来源:发表于2017-12-22 11:02 被阅读0次

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
}    

相关文章

  • AF学习笔记二

    AFHTTPRequestOperation是AFURLConnectionOperation的子类,它用于使用H...

  • AF学习笔记一

    1、AFHTTPRequestOperationManager的封装了与web应用程序通过HTTP通信的常见模式,...

  • AF学习笔记三

    在AFURLSessionManager类里创建NSURLSessionDataTask: 先说说NSURLSes...

  • JavaScript学习笔记二

    JavaScript学习笔记二 个人学习笔记参考阮一峰的JavaScript教学学习笔记二是对学习笔记一的补充 J...

  • MySQL 学习实践笔记(四)

    MySQL 学习实践系列 MySQL 学习实践笔记(一) MySQL 学习实践笔记(二) MySQL 学习实践笔记...

  • MySQL 学习实践笔记(三)

    MySQL 学习实践系列 MySQL 学习实践笔记(一) MySQL 学习实践笔记(二) MySQL 学习实践笔记...

  • MySQL 学习实践笔记(二)

    MySQL 学习实践系列 MySQL 学习实践笔记(一) MySQL 学习实践笔记(二) MySQL 学习实践笔记...

  • MySQL 学习实践笔记(一)

    MySQL 学习实践系列 MySQL 学习实践笔记(一) MySQL 学习实践笔记(二) MySQL 学习实践笔记...

  • 【Objective-c】_蓝牙开发

    ios蓝牙开发学习笔记(一)蓝牙概述 ios蓝牙开发学习笔记(二)central角色的实现 ios蓝牙开发学习笔记...

  • webpack4入门学习笔记(一)

    系列博客链接 webpack4入门学习笔记(一) webpack4入门学习笔记(二) webpack4入门学习笔记...

网友评论

      本文标题:AF学习笔记二

      本文链接:https://www.haomeiwen.com/subject/hmzkwxtx.html