例如,我有一个带有三个异步块的方法。每个块结果都需要执行下一个块才能获得最终的方法结果。所以,我要寻找的是一种很好的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 - 等待异步块完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27182863/