2016-01-21 59 views
0

對不起,標題可能會誤導你,因爲我不擅長英語。讓我來描述一下我的問題(您可以跳到本問題底部的TL; DR版本)。修復NSManagedObject的重複副本

  1. 在Coredata中,我設計了一個Product實體。在應用程序中,我從服務器下載產品。它返回JSON字符串,我對它進行碎片整理然後保存到CoreData。

  2. 有時候,我再次從該服務器搜索產品,與服務器進行一些交互。現在,我打電話給在線產品XProduct。 CoreData中可能不存在此產品,我也不想將它保存到CoreData中,因爲它可能不屬於此係統(它來自其他倉庫,而不是我當前的倉庫)。

  3. 假設這個XProduct具有相同的性質Product,但不屬於CoreData,從之前的開發者設計的另一個目的,XProduct,並複製從Product一切(代碼)。哇。這兩者之間的另一個不同之處是,XProduct有一些方法與服務器進行交互,如:- (void)updateStock:(NSInteger)qty;

  4. 現在,我想升級Product性質,我將不得不更新XProduct也。我必須單獨使用這兩個,如:


id product = anArrayContainsProducts[indexPath.row]; 
if ([product isKindOfClass:[XProduct class]] { 
    // Some stuff with the xproduct 
} 
else { 
    // Probably the same display to the cell. 
} 

TL; DR

基本上,我想創建這樣一個場景:

  1. 從服務器獲取數據。
  2. 檢查是否存在於CoreData中。
  3. 2 == true =>添加到數組(也可以從服務器更新一些數據)。
  4. 2 ==假=>創建對象(包含相同的結構,從NSManagedObject JSON字典=>添加到陣列。

在步驟4中創建的對象將永遠不會在CoreData存在。

問題

  1. 我怎樣才能創建一個NSManagedObject,而無需將其添加到NSMangedObjectContext,並確保應用程序將運行正常?
  2. 如果1不是鼓勵,請給我一個更好的方法來解決這個問題。我真的不喜歡重複那麼多的代碼。

更新

我在想繼承(XProduct : Product),但它仍然讓XProduct的NSManagedObject的子類,所以我不認爲這是一個不錯的辦法。

回答

0

有一些可能的工作可能性。

一個是創建託管對象,但不是將它們插入到上下文中。當您創建託管對象時,上下文參數允許爲零。例如,在沒有上下文的情況下調用insertNewObjectForEntityForName(_:inManagedObjectContext:)。這給你一個不會被保存的被管理對象的實例。它們具有與任何其他物體相同的壽命。

另一種方法是對這些對象使用第二個Core Data堆棧,並使用內存中的持久性存儲。如果在添加持久存儲(而不是NSSQLiteStoreType)時使用NSInMemoryStoreType,則會得到一個完整的工作核心數據堆棧。除了保存更改時,它們只能保存在內存中。它並不是真正的持久性,因爲它在應用程序退出時會消失,但除此之外,它與任何其他Core Data堆棧完全相同。

我可能會使用第二種方法,特別是如果這些對象有任何關係,但應該工作。

+0

隨着你的答案+ http://stackoverflow.com/a/3008439/1696598,我發現解決方案相當不錯!我選擇使用你的第一種方法,因爲它更容易實現到我的CoreDataUtil。 – Eddie