簡單,常見的模式,我不能在蘋果的文檔發現:如何製作/使用臨時NSManagedObjects?
- 加載一個coredata店
- 下載新的數據,在內存中創建對象
- 保存一些的新數據(通常「只有新位/沒有改變的位」)
取而代之,我可以找到這些替代方法,其中沒有一個是正確的:
- 不要在內存中創建 (當然,這意味着要扔掉 一切良好對象的對象。 使用大量 編寫您的代碼NSDictionary的服務沒有目的 除了解決方法CoreData的 失敗。一般不可行)
- 創建對象,但隨後刪除 那些你不想(蘋果建議在文檔 這一點,但他們的通知去可怕的錯誤 :那些「刪除」顯示當 您嘗試保存,即使他們 不應該/不)
- 在二級 環境中創建對象(蘋果強烈暗示這 是正確的,但顯然對於 不提供任何方式,你從臨時 移動對象沒有 這樣做(刪除剛纔創建的對象 ,然後做一個 保存)。一般情況下這是不可能的,因爲對象通常需要在新的上下文中被引用,並且保存將失敗)
當然,這不應該是這麼困難嗎?
如果我必須編寫所有代碼來手動深度複製一個對象(通過迭代它的所有字段和數據結構),爲什麼CoreData首先存在?這是CD在內部提供的基本功能。
我迄今爲止工作的唯一解決方案是選項2(來自蘋果的文檔),自定義啓發式方法可以「猜測」蘋果發送NSNotifications用於永遠不應該保存的對象(但Apple無論如何發送notofications)。這是一個可怕的黑客攻擊。
編輯:澄清:
我無法弄清楚如何獲得蘋果的通知才能正確地傳送。 Apple的代碼似乎將插入轉換爲「更新」,並將「臨時對象」轉換爲「刪除」等,我不能聽「新對象」。
修改:使用OS 4,在少數情況下使用OS 3,這種情況很糟糕,除非使用NSOperationQueue而不使用performSelectorInBackground(使用隊列平滑線程 - 在OS 3上它可以防止前臺線程在OS 4上變得餓死我還不確定發生了什麼,但它感覺更平滑) – Adam 2010-07-15 10:21:04
此外:我的一些「合併」問題是因爲我沒有發現(主要是未公開的)[NSManagedObject prepareForDeletion]方法;在99%的情況下,您必須*在您的應用程序中的每個對象上覆蓋該方法(蘋果公司從未在文檔中提到過這一點),以便從Apple獲得工作合併通知。否則,Apple將刪除處理合並之前需要處理的數據,然後再發送notifcatio給您! – Adam 2010-10-12 07:27:09