2013-08-18 28 views
0

我想取消一個長時間運行的計算方法,並在應用程序發送到後臺時關閉ViewController。iOS取消(void) - 執行並關閉ViewController

詳細信息: 在MainViewController中執行按鈕操作後,將顯示一個新的ResultViewController,並在ViewDidLoad方法中啓動長時間運行的計算方法。 計算方法在主線程上運行,這是完全正確的。

對於應用程序要後臺的情況,我想防止由於未完成的計算方法而終止應用程序。我設置了可在ResultViewController中使用的applicatinDidEnterBackground通知,但我不知道如何取消正在運行的計算方法並關閉ResultViewController。

謝謝。

回答

3

長時間運行計算方法在viewDidLoad方法開始。計算方法在主線程上運行,這是完全正常的。

誠實,我懷疑這可以被貼上'好'的標籤。

正確的解決方案是將這些計算移動到後臺線程並異步執行。

如果您阻止主線程時間過長(例如在這種情況下),那麼您甚至不會知道該應用程序將被置於後臺 - 關於該通知的通知將不會由應用程序的主隊列處理你消耗了所有的資源。看門狗只會殺死你的應用程序,因爲它不能在合理的時間內(約7-8秒)處理applicatinDidEnterBackground通知。


編輯(在響應評論質疑)

你可能想看看如何實現NSOperation以及如何使用NSOperationQueue。良好的資源,例如this site.

我告訴你的是大致的想法是如何取消操作工作 - 特別是使用isCancelled財產,這是檢查在操作的關鍵部分(並用於停止計算)。你不必在你的情況下實現NSOperation(除非你想 - 它可能是一個很好的練習;-)),但是如果你創建了一些正在處理數據的類,並且你在其中添加了一個類似cancel的方法,那麼你可以在您的代碼中模仿NSOperation's行爲。

+0

deekay,謝謝你的回答。我沒有想到通知被阻止的事實。我會盡力改變這一點。 – JFS

+0

你好Deekay再次,看起來你對這項業務瞭解更多。你可以給我更多的細節來把任務放在後臺,但是當'applicationDidEnterBackground'時可以殺死它。 – JFS

+0

查看我的更新回答。 – deekay