修复NSManagedObject的重复副本
对不起,标题可能会误导你,因为我不擅长英语。让我来描述一下我的问题(您可以跳到本问题底部的TL; DR版本)。修复NSManagedObject的重复副本
在Coredata中,我设计了一个
Product
实体。在应用程序中,我从服务器下载产品。它返回JSON字符串,我对它进行碎片整理然后保存到CoreData。有时候,我再次从该服务器搜索产品,与服务器进行一些交互。现在,我打电话给在线产品
XProduct
。 CoreData中可能不存在此产品,我也不想将它保存到CoreData中,因为它可能不属于此系统(它来自其他仓库,而不是我当前的仓库)。假设这个
XProduct
具有相同的性质Product
,但不属于CoreData,从之前的开发者设计的另一个目的,XProduct
,并复制从Product
一切(代码)。哇。这两者之间的另一个不同之处是,XProduct
有一些方法与服务器进行交互,如:- (void)updateStock:(NSInteger)qty;
现在,我想升级
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
基本上,我想创建这样一个场景:
- 从服务器获取数据。
- 检查是否存在于CoreData中。
-
2
== true =>添加到数组(也可以从服务器更新一些数据)。 -
2
==假=>创建对象(包含相同的结构,从NSManagedObject
JSON字典=>添加到阵列。
在步骤4中创建的对象将永远不会在CoreData存在。
问题
- 我怎样才能创建一个
NSManagedObject
,而无需将其添加到NSMangedObjectContext
,并确保应用程序将运行正常? - 如果
1
不是鼓励,请给我一个更好的方法来解决这个问题。我真的不喜欢重复那么多的代码。
更新
我在想继承(XProduct : Product
),但它仍然让XProduct的NSManagedObject
的子类,所以我不认为这是一个不错的办法。
有一些可能的工作可能性。
一个是创建托管对象,但不是将它们插入到上下文中。当您创建托管对象时,上下文参数允许为零。例如,在没有上下文的情况下调用insertNewObjectForEntityForName(_:inManagedObjectContext:)
。这给你一个不会被保存的被管理对象的实例。它们具有与任何其他物体相同的寿命。
另一种方法是对这些对象使用第二个Core Data堆栈,并使用内存中的持久性存储。如果在添加持久存储(而不是NSSQLiteStoreType
)时使用NSInMemoryStoreType
,则会得到一个完整的工作核心数据堆栈。除了保存更改时,它们只能保存在内存中。它并不是真正的持久性,因为它在应用程序退出时会消失,但除此之外,它与任何其他Core Data堆栈完全相同。
我可能会使用第二种方法,特别是如果这些对象有任何关系,但应该工作。
随着你的答案+ http://stackoverflow.com/a/3008439/1696598,我发现解决方案相当不错!我选择使用你的第一种方法,因为它更容易实现到我的CoreDataUtil。 – Eddie