cocoa - 如何确保 NSOperations 以故障安全的方式执行?

标签 cocoa timeout nsoperation nsoperationqueue

我想要什么

我的应用程序中有一个 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/

相关文章:

iphone - 如何重命名 NSMutableDictionary 中的键?

c++ - C++中的多个超时

timeout - ip_conntrack_tcp_timeout_established 未应用于整个子网

ios - 前台和后台线程的不同 ManagedObjectContext

objective-c - AFNetworking - 为什么它会产生一个网络请求线程?

objective-c - 在辅助线程中设置 NetworkActivityIndi​​catorVisible 值是否安全?

objective-c - NSWindow 消失

cocoa - 使用 NSDocument 时保存文件

Cocoa: [statusItem setView:myView] 无论如何都会创建一个白条菜单项

python - 如何实现urllib2.urlopen的超时控制