我在请求失败块中发布通知:
[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
属性为零。
如何在没有子类化的情况下访问它首要?
答案 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];
}];
}