2010-08-04 76 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/