Mat*_*ice 1 iphone asynchronous objective-c ios
处理多个异步Web调用的最佳实践是什么?
塞纳里奥:
我从一个Web服务中获取JSON提要中的大量地址列表,还查询CLGeocoder从地址字符串中进行纬度/经度查找.然后,一旦我有两条信息,我想执行一个动作.
什么是最好的方法,通过在链接链中将所有方法耦合在一起?
我建议创建一个新的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.
| 归档时间: |
|
| 查看次数: |
1772 次 |
| 最近记录: |