2012-05-03 49 views
4

我在我的應用程序中使用核心數據,並發現模擬器的一些奇怪行爲:當我在應用程序的核心數據中添加一些數據並使用XCode中的「停止」按鈕退出模擬器(或者按Cmd-Q)立即,下次啓動模擬器時數據不會存儲在數據庫中。經過一些測試後,我發現數據存儲在磁盤上:Core Data何時刷新到磁盤?

  • 立即如果我按主頁按鈕。 (差不多 - 這是可能退出應用程序之前,如果退出非常快速的數據存儲。)
  • 如果我讓添加數據後的一段時間(至少20秒)的應用程序運行。

它無助於調用[NSManagedObjectContext save:]。行爲是一樣的。

所以我的問題是:這種行爲的原因是什麼?有什麼辦法在退出前強制刷新磁盤?以及是否有一個設備(個人而言,我沒有看到任何,除了力接近,但奇怪的行爲困擾我的一個位)

回答

7

您可能正在使用嵌套上下文。如果您的上下文具有父上下文,則調用-save:將只保存到該上下文,而不保存到文件系統。

嵌套上下文(通常)用於安全地在後臺隊列上使用上下文,並允許前臺上下文保存,而不必承擔保存到文件系統的開銷。保存到文件系統將發生在後臺隊列上,而不會阻塞主線程。

+0

這是正確的。調用'[context save:&error]; [[context contextContext] save:&error];'執行作業,數據立即保存到磁盤。我必須進行兩個調用(這是合理的),但令人驚訝的是,如果我先調用save或contextContext,則無關緊要!你有解釋嗎? – JRV

+1

順便說一句,作爲其他人的一個說明:我沒有自己設置嵌套上下文,所以這是「幕後」。 – JRV

+3

您必須*不*在* context中調用'[[context parentContext] save:&error]''而不是線程安全的(正如我指出的那樣)。你需要調用'[[context parentContext] performBlock:^(){[[context parentContext] save:NULL]}];'(或類似的) –

10

停止模擬器與上運行時,我可以鬆散的數據這樣的任何風險Xcode中的停止按鈕可能與使用錘子砸碎iPhone(但保留SSD)相同。基本上,你的應用程序和其他一切都停止了。沒有合理的方法來確保數據在發生時保存。

+1

+1讓我微笑 – bearMountain

0

我也一直在摔跤很長一段時間,Daniel Eggert在(2)中的答案是我在互聯網上發現的第一個也是唯一有用的答案。我認爲JRV正在使用來自UIManagedDocument的NSManagedDocumentContext。如果是這種情況,那麼蘋果公司的'默認'保存方法是不完整的!採用Daniel Eggert的解決方案後,我的數據現在可以完美保存,並且不受模擬器「停止」手勢的影響。我推薦Daniel Eggert在上面(2)中的答案給任何希望在這種情況下編寫彈性代碼的人。

相關問題