我想要什么
我的应用程序中有一个 NSOperationQueue,在应用程序退出之前处理所有操作至关重要。我在退出时有以下代码,以确保 NSOperationQueue 在退出之前为空:
if ([NSThread isMainThread]) {
while ([[operationQueue operations] count] > 0) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05]];
}
} else {
[operationQueue waitUntilAllOperationsAreFinished];
}
我的代码之前遇到过一个问题,其中 NSOperation 在完成之前“卡住”并阻塞了整个队列。显然,在这种情况下,我的代码应该抛出异常,而现在确实如此。
但我仍然想防止发生任何奇怪的情况,即操作停止并阻塞队列,导致应用程序永远不会退出并且错误未被捕获。
我的垃圾解决方案
我正在考虑对完成其操作的队列设置超时。然后,当超时时,我可以抛出异常,然后可以捕获问题。
但是,这感觉不对。理想情况下,我不想依赖计时器来确保工作完成。
我的问题
有没有更好的、安全的方法来确保我的操作没有卡住?
最佳答案
如果我明白的话...
- 您想知道您的操作没有卡住...变成...
- 您想知道所有操作都将完成执行...变成...
- 您想解决the halting problem
祝你好运。
但实际上,您使用 waitUntilAllOperationsAreFinished
所做的事情与您将获得的效果差不多。您可以添加另一个类来监视每个操作并确保它不会运行太长时间(比如比您期望的运行时间长 10 倍),此时它将-cancel
NSOperation
(或多或少是你的计时器方法)。然而,即使这样也不是万无一失的,因为操作可能会在无法检查 -isCancelled
的地方被阻止(例如,在系统调用内)。
关于cocoa - 如何确保 NSOperations 以故障安全的方式执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3404784/