Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 如何确保NSO操作以故障保护方式执行?_Cocoa_Timeout_Nsoperation_Nsoperationqueue - Fatal编程技术网

Cocoa 如何确保NSO操作以故障保护方式执行?

Cocoa 如何确保NSO操作以故障保护方式执行?,cocoa,timeout,nsoperation,nsoperationqueue,Cocoa,Timeout,Nsoperation,Nsoperationqueue,我想要什么 我的应用程序中有一个NSOperationQueue,在应用程序退出之前处理所有操作非常重要。我在退出时有以下代码,以确保NSOperationQueue在退出前为空: if ([NSThread isMainThread]) { while ([[operationQueue operations] count] > 0) { [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIn

我想要什么

我的应用程序中有一个NSOperationQueue,在应用程序退出之前处理所有操作非常重要。我在退出时有以下代码,以确保NSOperationQueue在退出前为空:

if ([NSThread isMainThread]) {
    while ([[operationQueue operations] count] > 0) {
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05]];
    }
} else {
    [operationQueue waitUntilAllOperationsAreFinished];
}
我以前的代码遇到过一个问题,NSO操作在完成之前“冻结”,它阻塞了整个队列。显然,在这种情况下,我的代码应该抛出一个异常,而现在它确实抛出了一个异常

但我仍然希望防止出现任何奇怪的情况,操作停止并阻塞队列,从而导致应用程序永不退出,错误也不会被捕获

我的垃圾解决方案

我正在考虑在队列上设置一个超时来完成它的操作。然后,当它超时时,我可以抛出一个异常,然后就可以发现问题了

然而,这感觉不对。理想情况下,我不想依赖计时器来确保工作完成

我的问题

有没有更好的、故障安全的方法来确保我的操作没有冻结?

如果我理解

  • 你想知道你的行动没有冻结。。。变成
  • 您想知道您的所有操作都将完成执行。。。变成
  • 你想解决吗
祝你好运


但实际上,您使用
waituntlalloperations finished
所做的工作与您将得到的一样好。您可以添加另一个类来监视每个操作,并确保它不会运行太长时间(比如说比您预期的运行时间长10倍),此时它将
-取消
NSOperation
(或多或少是您的计时器方法)。然而,即使这样也不是万无一失的,因为在无法检查
-isCancelled
(例如,在系统调用内部)的情况下,操作可能会被阻止。

正如RadioPiel在上面的评论中所说,您实际上并不是在寻找停止问题。如果您能很好地确定操作长度的上限和下限,那么您可以给每个操作一个时间窗口,看看它们是否已经完成。如果你不能做好下限,那么这将变得效率低下。此外,如果您的任何操作都有一个无限循环,那么它们仍然会使其他线程饥饿,这取决于您所处的环境。(然后你就不走运了。)


用过于宽泛的问题概括来称之为停顿问题是计算机科学的经典错误之一。你并不总是需要解决一般问题。请参阅:

谢谢你的回答,戴夫。我很高兴能够放心,我的超时方法并没有太大的偏差。我满足于在操作队列超时时崩溃,那么至少我知道这里存在某种问题。停止问题的意思是:“我们可以构建一个算法来确定任何算法是否会在某个点停止。”据我所知,OP不会有这么广泛的方法:)您的操作是以什么方式“冻结”的?