2016-01-21 23 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