ios - 等待异步 block 完成

标签 ios grand-central-dispatch

例如,我有一个包含三个异步 block 的方法。每个 block 的结果都需要执行下一个 block 以获得最终的方法结果。所以,我正在寻找的是一个很好的 GCD 策略,让它们以严格的顺序执行并且没有死锁

__block id task1Result;    
__block id task2Result;    
__block id finalResult;  

[self startTask1:^(id result) { task1Result = result }]  

[self startTask2:task1Result block:^(id result) { task2Result = result }]  

[self startTask3:task2Result block:^(id result) { finalResult = result }]  

UPD。我找到了解决方案:

dispatch_semaphore_t sem = dispatch_semaphore_create(0);

__block id task1Result;    
__block id task2Result;    
__block id finalResult;  

[self startTask1:^(id result) { 
  task1Result = result;
  dispatch_semaphore_signal(sem);
}];  
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

[self startTask2:task1Result block:^(id result) { 
  task2Result = result;
  dispatch_semaphore_signal(sem);
}];  
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

[self startTask3:task2Result block:^(id result) { finalResult = result }];

但在我的案例中,我遇到了一些库方法的问题,这导致应用程序陷入僵局。 ><

最佳答案

创建一个串行调度队列,如下所述:
https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

简而言之:

dispatch_queue_t queue;
queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_async(queue, ^{
    printf("Do some work here.\n");
});
dispatch_async(queue, ^{
    printf("When finished do next task.\n");
});

请注意,您必须自己处理队列。

关于ios - 等待异步 block 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27182863/

相关文章:

ios - 提供带有目标回调队列的异步和同步 API

iphone - 如何在没有导航 Controller 的情况下创建多个 View ?

ios - 如何对具有不同图像(图标)的点进行聚类? map 盒

ios - 电容登录苹果无法使用

iphone - 委托(delegate)没有从另一个 View Controller 调用,尝试了一切

swift - 回调在什么队列上运行?

swift - 并行添加到数组

swift - 应该根据要求执行 segue

ios - 调整 UIButton 上的背景图像大小

swift GCD : Why signal handler doesn't work in function