2009-09-11 62 views
0

在用於核心數據棧生成的代碼,保存上managedObjectContext問題被稱爲在applicationWillTerminate方法。這是在退出前處理上下文中所有未保存的對象。與xcode中生成的核心數據棧代碼邏輯和核心數據樣本代碼

這也有保存任何臨時對象的不良副作用。 (這個問題在蘋果示例代碼中也是可見的,如果您點擊+在食譜示例代碼中添加新食譜,然後按主頁按鈕以終止該應用程序,則下次啓動該應用程序時會看到半分食譜對象)。

處理此問題的首選設計模式是什麼?我可以想到以下幾點。

  1. 對臨時對象使用不同的暫存器managedObjectContext,當您決定真正保存時,然後在主managedObjectContext中推送副本。僅在applicationWillTerminate中的主managedObjectContext上調用保存。 (有沒有簡單,快捷的方式從一個managedObjectContext在新的上下文手動創建副本將對象移動到另一個分開?)
  2. 刪除applicationWillTerminate保存,但要確保所有的對象都保存更改後立即。 (這可能並不容易,我有一個Tabbed應用程序,用戶可能同時啓動編輯操作)。

讓我知道是否有更好的方式來處理這個問題。

回答

0

溶液1確實意味着複製對象。 該示例在CoreDataBooks示例中進行了說明。您可以在第二個上下文中創建新對象,然後通過觀察NSManagedObjectContextObjectsDidChangeNotification並將更改合併到主上下文中,直接(使用objectWithID :)或(如示例中所示和解釋的)將它們錯誤置於主上下文中。

+0

這是絕對是更新更新的更好方法,因爲CD可以完成集成更改的所有工作。 – siasl 2011-01-12 14:05:43

+0

請參考addViewController中的註釋:(AddViewController *)控制器didFinishWithSave:(BOOL)保存在CoreDataBooks示例的RootViewController.m中,以獲取上述詳細說明。 – siasl 2011-01-12 14:06:26

0

解決方案1需要完全複製對象。但是,複製對象很棘手。屬性可以輕鬆處理,但關係很細微。要複製關係(深層複製而不是淺層複製),您需要遞歸過程,在這種過程中,您始終注意,如果在遞歸步驟中再次遇到同一對象,則不會一遍又一遍複製同一對象。

方案二可能更容易根據你的應用程序邏輯來實現,正如你提到的,GUI。

第三種可能性正確處理臨時對象如下。將一個布爾屬性添加到與您的對象關聯的實體,該實體跟蹤對象狀態(臨時或不臨時)。然後,使用的NSManagedObjectContext方法

- (NSSet *)insertedObjects 

您只需枚舉對象的集合,並根據布爾標誌的值保存或刪除對象。

請注意,這可能是相當昂貴的,具體取決於對象的數量。

+0

您對解決方案1是對的。這可能會很棘手。與解決方案2相結合的第三個解決方案應該適合我。我傾向於在用戶提交更改後立即保存。它僅適用於用戶可能正在添加新實例並決定終止該應用程序的情況。檢查insertionObjects將在那裏工作,因爲我不期望太多的臨時對象。感謝您的建議。 – siasl 2009-09-11 23:35:51

+0

增加了新的邏輯,像魅力一樣工作...... – siasl 2009-09-12 02:19:48

+0

很高興知道;-) – 2009-09-12 06:32:10