如何访问AFHTTPRequest的完成块?

时间:2015-06-28 23:51:22

标签: objective-c afnetworking objective-c-blocks nsoperation afhttprequestoperation

我在请求失败块中发布通知:

[manager    POST:path
    parameters:nil
    success:^(AFHTTPRequestOperation *operation, id responseObject) {
        if (operation.response.statusCode == 200) {
            //message delegate
        }
  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      [[NSNotificationCenter defaultCenter] postNotificationName:HOST_UNREACHABLE object:operation];
}];

在接收通知的方法中,completionBlock属性为零。

如何在没有子类化的情况下访问它首要?

1 个答案:

答案 0 :(得分:0)

首先回答如何将块发送到NSNotification的问题:

你尝试这样做的方式很危险,因为我们不知道AFHTTPSessionManager如何处理你传递它的块,除非它在公共接口中,它的作用可能不会随着时间的推移而保持不变。 / p>

因此,创建一个局部变量来表示您想要传递的块,比如,completionBlock ...

// this is a local variable declaration of the block
void (^completionBlock)(AFHTTPRequestOperation*,id) = ^(AFHTTPRequestOperation *operation, id response) {
    if (operation.response.statusCode == 200) {
        //message delegate
    }
};

[manager POST:path
    parameters:nil
    success:completionBlock
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    [[NSNotificationCenter defaultCenter] postNotificationName:HOST_UNREACHABLE object:completionBlock];
}];

观察者可以获取块并以这种方式调用它......

- (void)didReceiveNotification:(NSNotification *)notification {
    void (^completionBlock)(AFHTTPRequestOperation*,id) = notification.object;

    // use it
    [manager POST:someOtherPath
        parameters:nil
        success:completionBlock
        // etc.
    ];
}

但我认为这种做法很奇怪。它将向请求发出请求的请求分散负责,让它需要知道重试参数的路径(在这种情况下你没有,但有一天你可能会这样)。

考虑改为对经理进行子类化并添加执行重试的行为。现在,您的经理子类可以负责所有请求,包括重试,而您的其他类只是处理结果的客户。有点像...

@interface MyAFHTTPRequestManager : AFHTTPSessionManager

- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
                      retryURL:(NSString *)retryURLString
                    parameters:(nullable id)parameters
                       success:(nullable void (^)(NSURLSessionDataTask *task, id responseObject))success
                       failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure;

@end

让您的子类实现使用第一个URLString调用super,并在失败时使用retryURLString调用super。 e.g。

- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
                      retryURL:(NSString *)retryURLString
                    parameters:(nullable id)parameters
                       success:(nullable void (^)(NSURLSessionDataTask *task, id responseObject))success
                       failure:(nullable void (^)(NSURLSessionDataTask *task, NSError *error))failure {

    [super POST:URLString parameters:parameters success:success
        failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            [super POST:retryURLString parameters:parameters success:success failure:failure];
    }];
}