2011-07-21 95 views
1

我有背景NSInvocationOperation創建和保存的NSArrayNSManagedObject子類。NSOperationQueue waitUntilAllOperationsAreFinished與performSelectorOnMainThread

我知道保存應該發生在主線程上,所以我使用performSelectorOnMainThread來保存操作。

當用戶在iPhone 3G上按下Home按鈕時,應用程序將退出。在applicationDidEnterBackground我做[queue waitUntilAllOperationsAreFinished],以便NSInvocationOperation有時間完成。

問題是,它只是等待操作的「背景部分」 - 應用程序在performSelectorOnMainThread操作前被關閉,部分操作被稱爲。這意味着我的NSManagedObject不會被保存。

我試圖保存操作線程中的對象 - 應用程序正常關閉並且更改已保存。但我認爲這不好,因爲NSManagedObject不是線程安全的。還是可以做到這一點?

它看起來像趕上22.我必須錯過的東西 - 有沒有任何優雅的方式如何解決這個問題?

回答

0

您應該只使用通知主要上下文的單獨上下文在後臺執行保存操作。這意味着創建,提取和保存被管理對象應該在這個單獨的上下文中完成,這在Core Data - Concurrency with Core Data中有記錄。您還應該啓動background task以確保您有足夠的時間來完成保存數據。

+0

是的,我擔心我應該做所有這些,但並沒有那麼糟糕:)我還必須將輔助上下文的合併策略更改爲NSMergeByPropertyStoreTrumpMergePolicy,因爲同一對象的某些其他屬性同時被更改並保存主要背景。 –

+0

啊,這很好,它起初看起來很多,但真的不是那麼糟糕。我有一個同步操作,將合併策略設置爲覆蓋。 – Joe

相關問題