objective-c - 如何等待异步调度的 block 完成?

我正在测试一些使用 Grand Central Dispatch 进行异步处理的代码。测试代码如下:

[object runSomeLongOperationAndDo:^{
    STAssert…
}];

测试必须等待操作完成。我目前的解决方案如下所示:

__block BOOL finished = NO;
[object runSomeLongOperationAndDo:^{
    STAssert…
    finished = YES;
}];
while (!finished);

这看起来有点粗略,你知道更好的方法吗?我可以公开队列,然后通过调用 dispatch_sync 来阻止:

[object runSomeLongOperationAndDo:^{
    STAssert…
}];
dispatch_sync(object.queue, ^{});

...但这可能会在 object 上暴露太多。

最佳答案

尝试使用 dispatch_semaphore。它应该看起来像这样:

dispatch_semaphore_t sema = dispatch_semaphore_create(0);

[object runSomeLongOperationAndDo:^{
    STAssert…

    dispatch_semaphore_signal(sema);
}];

if (![NSThread isMainThread]) {
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
} else {
    while (dispatch_semaphore_wait(sema, DISPATCH_TIME_NOW)) { 
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0]]; 
    }
}

即使 runSomeLongOperationAndDo: 认为操作实际上不够长,不适合线程化并改为同步运行,这也应该正确运行。

https://stackoverflow.com/questions/4326350/

相关文章:

ios - 在 UITableViewCell 中有一个 UITextField

objective-c - 为什么 Objective-C 委托(delegate)通常被赋予属性分

ios - 如何在 NSAttributedString 中创建可点击链接?

objective-c - Objective-C中方法旁边的加号和减号是什么意思?

ios - UIImageView 上的 UIGestureRecognizer

objective-c - Objective-C Cocoa 应用程序中的正则表达式

ios - Storyboard 中的 Modal 和 Push segue 有什么区别?

objective-c - 是否可以刷新 UITableView 中的单个 UITableViewC

objective-c - 最佳实践? - 数组/字典作为核心数据实体属性

ios - 如何在 Swift 中设置返回按钮文本