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

Mat*_*ice 1 iphone asynchronous objective-c ios

处理多个异步Web调用的最佳实践是什么?

塞纳里奥:

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

什么是最好的方法,通过在链接链中将所有方法耦合在一起?

red*_*t84 7

等待同步任务:

我建议创建一个新的NSOperationQueue,配置它以根据需要包含多个线程,然后在该线程上启动操作.要等待它们完成,只需调用waitUntilAllOperationsAreFinished方法即可.

例如:

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

// Add your tasks here

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

[operationQueue waitUntilAllOperationsAreFinished];
Run Code Online (Sandbox Code Playgroud)

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

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

等待已经异步的任务:

有时上述方法是不够的,可能是因为您需要等待已经异步的任务(如启用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);
Run Code Online (Sandbox Code Playgroud)

有关更多信息Obj-C semaphores.

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