以下方法使用 AFNetworking 向 Web 服务发送请求并(成功时)对响应进行操作。AFNetworking 异步执行请求并使用块来判断成功或失败。所以发送请求的方法看起来像这样(简化):
- (void)sendRequestForConnector:(NSString *)connector
success:(void (^)(NSData *responseXml))success
failure:(void (^)(NSError *error))failure
{
AFHTTPRequestOperation *operation = [self HTTPRequestOperationForConnector:connector];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
{
[self handleSuccessForConnector:connector response:[operation responseData]];
success([operation responseData]);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
[self handleFailureForConnector:connector error:error];
failure(error);
}
[operation start];
}
在另一个类中,此方法用于多次调用 Web 服务。上一个调用成功后,下一个调用就完成了。这个方法看起来像这样(为简洁起见省略了故障块):
- (void)import
{
[client sendRequestForConnector:@"cities" success:^{
[client sendRequestForConnector:@"categories" success:^{
[client sendRequestForConnector:@"categoryTranslations" success:^{
[client sendRequestForConnector:@"products" success:^{
[client sendRequestForConnector:@"productTranslations" success:^{
[self finishImport];
}];
}];
}];
}];
}];
}
这是可行的,但是正如我们所看到的,每个 web 服务调用都会添加另一个嵌套的成功块处理程序。在我看来,必须有更好的方法来做到这一点,但我想不出一个。
最好,我想在执行下一个调用之前等待上一个调用完成,并使用 GCD 之类的东西异步调用整个导入方法。然而,AFNetworking 并不是为进行同步调用而设计的。
任何如何实现这一目标的想法都非常受欢迎。还是我目前的解决方案是可行的?