例如,我有一个包含三个异步 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/