【发布时间】:2023-03-24 16:52:01
【问题描述】:
我正在使用AFNetworking 异步调用网络服务。其中一些调用必须链接在一起,其中调用 A 的结果由调用 B 使用,而调用 B 由调用 C 使用,等等。
AFNetworking 处理异步调用的结果,并在创建操作时设置成功/失败块:
NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/public_timeline.json"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@"Public Timeline: %@", JSON);
} failure:nil];
[operation start];
这会导致嵌套的异步调用块很快变得不可读。当任务不相互依赖而必须并行执行并且执行取决于所有操作的结果时,情况就更加复杂了。
似乎更好的方法是利用promises 框架来清理控制流。
我遇到过MAFuture,但不知道如何最好地将它与 AFNetworking 集成。由于异步调用可能有多个结果(成功/失败)并且没有返回值,因此它看起来并不理想。
任何指针或想法将不胜感激。
【问题讨论】:
-
感谢您提出这个问题——您已经得到了一些很好的答案。不过,我最初在找到它时遇到了一些麻烦,并通过查看承诺来到了这里。这种反模式可能发生在任何异步回调 API 上:它不是 AFNetworking 特定的。我正在使用类似的搜索:“序列化嵌套块回调”。也许更多的标签会有所帮助?不过也可能是我! :-)
标签: objective-c design-patterns afnetworking objective-c-blocks