等待多个异步Web调用,然后对其结果执行操作

时间:2013-03-15 14:21:11

标签: iphone ios objective-c asynchronous

处理多个异步Web调用的最佳做法是什么。

塞纳里奥:

我从一个Web服务的JSON提要中获取一个大的地址列表,同时查询CLGeocoder从地址字符串中进行纬度/经度查找。然后,一旦我有两条信息,我想要执行一个动作。

最好的办法是如何在链接链中将所有方法结合在一起?

2 个答案:

答案 0 :(得分:7)

等待同步任务:

我建议创建一个新的NSOperationQueue,将其配置为拥有所需数量的线程,然后在该线程上启动操作。要等待它们完成,只需调用waitUntilAllOperationsAreFinished方法。

例如:

NSOperationQueue* operationQueue = [[NSOperationQueue alloc] init];

// Add your tasks here

[operationQueue addOperationWithBlock:^{
    // Long running task
}];

[operationQueue waitUntilAllOperationsAreFinished];

小心不要阻止主线程,否则应用程序在加载时将无响应。

如果您需要比这更复杂的东西,可以使用较低级别的API dispatch_group_t对线程进行分组并等待它们。请查看this response以获得更深入的解释。

等待已经异步的任务:

有时上述方法还不够,可能是因为您需要等待已经异步的任务(例如启用GPS或等待某些外部事件)。在这些情况下,您可以使用信号量。你必须非常小心错误处理和信号量,或者你可以永远阻止一个线程。

dispatch_semaphore_t sema = dispatch_semaphore_create(0);

[object performLongOperationAndDo:^{
    dispatch_semaphore_signal(sema);
}];

dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);

更多info about Obj-C semaphores

除非必要,否则我会坚持NSOperationQueue

答案 1 :(得分:1)

也许你会觉得这很有用:Reactive Cocoa

它是一种非常优雅的解决方案。该框架的学习曲线非常艰难。