我正在测试一些使用 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