gpt4 book ai didi

objective-c - 如何等待 NSOperationQueue 在单元测试中完成?

转载 作者:行者123 更新时间:2023-12-03 16:55:58 25 4
gpt4 key购买 nike

问题

  • 我有一个名为 logEntryGeneratorQueue 的 NSOperationQueue
  • 我想等到队列上的所有操作完成

如果我使用:

[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。

我尝试过的

我尝试将 runUntilDate 替换为 sleep,正如我所想,这意味着每个测试在到达此处时都会永远暂停。

我的问题

是否有更好的方法来等待 NSOperationQueue 在主线程上完成?如果没有,我怎样才能让这段代码在 10.6 下工作?

最佳答案

解决方案

我意识到我的代码处于永恒循环中,因为我在主线程上调用mergeChangesFromContextDidSaveNotification,同时还在等待队列在主线程上完成。由于合并更改是在 waitUntilAllOperationsAreFinished 之后调用的,因此它从未被执行。

我认为答案是更改运行 NSOperationQueues 的位置。我不应该在主线程上运行处理核心数据的 NSOperationQueue。而且我想,出于性能原因,我真的不应该在主线程上运行这些密集的东西。

关于objective-c - 如何等待 NSOperationQueue 在单元测试中完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3619786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com