问题
- 我有一个名为 NSOperationQueue
logEntryGeneratorQueue
- 我想等到队列上的所有操作都完成
如果我使用:
[logEntryGeneratorQueue waitUntilAllOperationsAreFinished];
如果添加到队列的线程本身在后台,它工作正常。
但是,如果我通过单元测试运行此代码,它将在主线程上运行。所以我想出了这个“解决方案”,我真的不喜欢:
if ([NSThread isMainThread]) {
while ([[logEntryGeneratorQueue operations] count] > 0) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
} else {
[logEntryGeneratorQueue waitUntilAllOperationsAreFinished];
}
这总是不太理想,但在 10.5 上一直运行良好。但是,现在我已经将我的项目升级为使用 10.6 SDK,这会中断。
在一项测试中,它实际上在完成之前退出了测试。我不知道为什么 - 我认为这与 NSOperationQueues 在 10.6 中的工作方式不同有关 - 他们现在使用 GCD。
我试过的
我尝试用 sleep 替换 runUntilDate,正如我所想的,这意味着每次测试到这里时都会永远暂停。
我的问题
有没有更好的方法来等待 NSOperationQueue 在主线程上完成?如果没有,我怎样才能让这个代码在 10.6 下工作?