2013-02-04 51 views
17

如何更新子託管對象上下文,使其與父項具有相同的數據?子對象上下文的內容是否與父對象的內容一致?

據我所知,在儲蓄時,孩子只能走一步,即向父母。然而,當抓取抓取總是非常深入到父級和持久性存儲。所以我希望事情會是一樣的。

但事實並非如此。

我有一個託管對象上下文,它是所有其他託管對象上下文的父項。

一個孩子更改數據並保存。父母也改變了。我對父進行executeFetchRequest,我發現數據發生了變化。

但是,父母的一些孩子仍然使用舊數據。相同的對象ID相同的數據。不知何故,財產的價值保持不變。

如何告訴孩子從父母重新加載新數據?

更確切地說

說P是父

說它C1 C2 C3作爲子

然後C1改變數據和提交。更改傳播到P.但是,在C2和C3執行executeFetchRequest仍然顯示舊數據。

什麼給?

例如,當我檢查了imageBlob財產,這就是我得到:

兒童:

2013-02-05 13:57:42.865 BadgerNew[78801:c07] imageBlob: <UIImage: 0x89c3c50> 
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null> 
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null> 
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null> 

家長:

2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x114af650> 
2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x8e492e0> 
2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x114c79b0> 
2013-02-05 13:57:42.869 BadgerNew[78801:c07] imageBlob: <UIImage: 0xa8c76e0> 

這裏是一個更全面的版本爲什麼我記下了moc,父moc,blob,URL和對象ID。 孩子:

特別是我想讓mainqueue managedobject上下文成爲父代的另一個子代,而不是所有其他managedObjectContext的父代。另一方面,我也希望mainQueue託管對象上下文具有最新的信息。我想知道標準解決方案是什麼。

+3

哇,我把50個恩澤,並獲得5票的話,我得了10分回來:) –

回答

21

孩子有無效的現有參考。如果您希望兄弟姐妹在父母保存後同步,您必須使reset使孩子無效。

在調用reset後,所有接收者的被管理對象都被「忘記」了。如果使用這種方法,你應該確保你也放棄了對使用接收者獲取的任何被管理對象的引用,因爲之後它們將會失效。

如果您希望更好地控制子上下文中已更改的對象,則還可以在保存父上下文時在所有子上下文上更改的個別對象上使用refreshObject:mergeChanges:

+0

雖然它的真正使用復位是一種矯枉過正。我正在尋找其他解決方案。 –

+0

我添加了更新上下文中個別管理對象的方法。 –

+0

布拉沃:)我實際上使用過。享受賞金:)呃,任何人都知道爲什麼這個問題是downvoted? –

0

實際上有一個關於如何正確地做到這一點,包括WWDC會議視頻從2011年和2012年2012屆214「核心數據的最佳實踐」將是你特別有趣大量的文檔資料。

例如,對於您的保存,它應該看起來像:

[child performBlock:^{ 
    [child save:&error]; 
    [parent performBlock:^{ 
     [parent save:&parentError]; 
    }]; 
}]; 

這不僅節省了孩子,這些變化不僅給家長,你節省的父母 - 這將正確地傳播所有這些變化其他兒童情況。看看你的問題,我想你可能會遇到一些其他的問題,而Session 214可能會對解決它們很有幫助。

至於重置的背景下,我不建議這樣做使用父子上下文時。我也會避開使用refreshObject:mergeChanges:。爲此目的使用objectWithID可以爲您節省很多痛苦,因爲它將充分利用託管對象上下文的行緩存。它也只會通過一堆兒童和父母來滿足要求。

+0

這完全是問題所在。我想,改變父母,改變所有的孩子。沒有。正如Fruity Geek所說,從父母重新加載數據的核心數據練習是不穩定的。核心數據的作用是使用現有的兒童數據(如果存在)。只有當它不存在或陳舊的核心數據纔會看起來更深。 –

+1

+1表示我應該在[child performBlock]內調用[parent performBlock] –

+0

但是Fruity Geek的答案更正確。我會選擇他,除非有更好的答案,我想不出來。 –

相關問題