2010-08-04 46 views
2

我想我怎样才能确保NSOperations以失败的方式执行?

我在我的应用程序有一个NSOperationQueue是什么,它的关键是应用程序退出之前的所有操作得到处理。我有下面的代码上退出,以确保NSOperationQueue是空的退出之前:

if ([NSThread isMainThread]) { 
    while ([[operationQueue operations] count] > 0) { 
     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05]]; 
    } 
} else { 
    [operationQueue waitUntilAllOperationsAreFinished]; 
} 

我以前在那里的的NSOperation“冻结”遇到了一个问题,我的代码完成之前,并封锁了整个队列。显然,在这样的情况下,我的代码应该抛出一个异常,现在就这样做。

但我仍然想防止任何奇怪的事情发生在操作停止和阻止队列,导致应用程序永不退出和故障没有被捕获。

我的垃圾解决方案

我正在考虑把超时队列完成它的操作。然后,当它超时时,我可以抛出异常,然后可以捕捉到问题。

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

我的问题

有没有更好的,达不到确保我操作的安全,办法还没有冻结?

+0

您的操作以何种方式“冻结”? – 2012-06-07 07:15:06

回答

4

如果我理解......

    你想知道你的操作没有冻结......成为
  • ...
  • 你想知道你的所有操作都将执行完毕。 .. ...成为
  • 要解决the halting problem

与好运。

实际上,你在做什么与waitUntilAllOperationsAreFinished是一样好,你会得到。你可以添加另一个类来监视每个操作,并确保它不会运行太久(比你期望的运行时间长10倍),在这一点上,它会-cancelNSOperation(或多或少的你的计时器方法) 。但是,即使这样也不是万无一失的,因为在无法检查-isCancelled(例如在系统调用中)的情况下,操作可能会被阻止。

+0

谢谢你的伟大答案,戴夫。很高兴能够放心,我的超时方式不会太远。我满足于在操作队列超时时崩溃,至少我知道这里存在某种问题。 – 2010-08-04 16:14:43

+0

很好的答案,谢谢! – bentford 2010-12-21 10:09:33

+1

那么,暂停问题的意思是:“我们可以建立一个算法,确定* any *算法是否会在某个时候停止。”据我了解,OP不会有这么广泛的方法:) – radiospiel 2012-01-12 08:19:07

1

正如上文评论中的radiospiel所说,你实际上并没有在寻找停止问题。如果您可以在操作的长度上做出好的上限和下限,则可以为每个操作提供一个时间窗口,并查看它们是否已完成。如果你不能做好下界,那么这将变得效率低下。此外,如果您的任何操作具有无限循环,则依赖于您所处的环境,它们仍然可能会使其他线程挨饿。(然后,您运气不佳)。

使用过度泛泛的问题调用他们的停机问题是经典的计算机科学错误之一。你并不总是需要一般的问题。请参阅:http://valgrind.org/