iphone - 异步调度递归 block

标签 iphone objective-c grand-central-dispatch objective-c-blocks

假设我运行这段代码:

__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);

该 block 从外部调用一次。当到达内部调用时,程序崩溃,没有任何细节。如果我在任何地方都使用直接调用而不是 GCD 调度,一切都会正常进行。

我也试过用 block 的副本调用 dispatch_after。我不知道这是否是朝着正确方向迈出的一步,但这还不足以让它发挥作用。

想法?

最佳答案

在尝试解决这个问题时,我发现了一段代码,它解决了很多与递归 block 相关的问题。我一直没能再次找到来源,但仍然有代码:

// 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 允许非参数 block 。它可以为单个或多个参数 block 重写。使用此构造简化了内存管理,例如,没有保留循环的机会。

关于iphone - 异步调度递归 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5394647/

相关文章:

ios - 重新加载数据时 TableView 闪烁

iphone - CGContextFillRect 不绘制矩形?

iphone - 如何让数字键盘始终出现在 uiview 中?

objective-c - 单元测试 Cocoa 用户界面

objective-c - 单例上的多个类方法以避免子类?

swift - 如何在 Swift 3 中创建具有 QoS 属性的 dispatch_queue?

iphone - 自定义 UIMenuController

objective-c - 在自定义键盘扩展中添加贴纸

iphone - bundle 标识符和配置文件

ios - 类似于 Facebook/Google 搜索引擎的索引搜索