假设我运行以下代码:
__block int step = 0;
__block dispatch_block_t myBlock;
myBlock = ^{
if(step == STEPS_COUNT)
{
return;
}
step++;
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC / 2);
dispatch_after(delay, dispatch_get_current_queue(), myBlock);
};
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC / 2);
dispatch_after(delay, dispatch_get_current_queue(), myBlock);
该块从外部被调用一次。到达内部调用后,程序将崩溃,没有任何详细信息。如果我在所有地方都使用直接调用而不是GCD调度,则一切正常。
我也尝试过使用该块的副本调用dispatch_after。我不知道这是否是朝着正确方向迈出的一步,但这还不足以使其正常工作。
有想法吗?
最佳答案
尝试解决此问题时,我发现了一段代码,可解决许多与递归块相关的问题。我无法再次找到源,但是仍然有代码:
// in some imported file
dispatch_block_t RecursiveBlock(void (^block)(dispatch_block_t recurse)) {
return ^{ block(RecursiveBlock(block)); };
}
// in your method
dispatch_block_t completeTaskWhenSempahoreOpen = RecursiveBlock(^(dispatch_block_t recurse) {
if ([self isSemaphoreOpen]) {
[self completeTask];
} else {
double delayInSeconds = 0.3;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), recurse);
}
});
completeTaskWhenSempahoreOpen();
RecursiveBlock
允许使用非参数块。可以为单个或多个参数块重写它。使用此结构简化了内存管理,例如,没有保留周期的机会。关于iphone - 异步调度的递归块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5394647/