由于objectID在临时对象和永久对象之间发生变化,因此如何有效地处理Core Data中的临时对象?

时间:2011-04-07 16:50:18

标签: objective-c core-data

在Core Data中处理临时对象的最佳方法是什么?我已经看到了创建临时上下文的解决方案,它们被插入到nil上下文中等等。

然而,这是我在这两个解决方案中看到的问题。我正在使用Core Data作为我的对象模型,并且在我的一些视图中存储了一组NSData的Core Data对象。我遇到的问题是当存储对象时,objectID会更改,这会有效地使存储在任何NSSet中的任何内容无效,因为isEqual和hash现在是不同的。虽然我可以使存储在NSSet中的对象无效,但它通常不实用,当然也不容易。

以下是我考虑过的事情:

1)覆盖isEqual方法和NSManagedObject上的哈希(显然是坏的)

2)不要在NSSet中放置任何NSManagedObject(使用始终修复密钥的NSDictionary)

3)使用完全不同的类型存储在NSSet中我可以正确实现isEqual和哈希代码方法

有没有人有更好的解决方案呢?

4 个答案:

答案 0 :(得分:3)

NSSet中的ManagedObjects - 听起来像核心数据关系。为什么不简单地将临时托管对象存储在关系中,让Core Data处理您现在遇到的问题。然后,您可以专注于何时以及如何删除临时对象,或者打破关系或任何需要的关系。

答案 1 :(得分:1)

  

然而,这是我在这两个解决方案中看到的问题。我正在使用Core Data作为我的对象模型,并且在我的一些视图中存储了一组NSData的Core Data对象。我遇到的问题是当存储对象时,objectID会更改,这会有效地使存储在任何NSSet中的任何内容无效,因为isEqual和hash现在是不同的。

tjg184,

这里的问题不是转换为永久ID,而是容器类依赖于不可变的哈希。因此,将容器类更改为数组或字典,此问题就会消失。 (你放弃了对数组的统一,但是通过瞬态集来执行单一操作很容易处理。)

安德鲁

答案 2 :(得分:0)

您可以继承NSManagedObject并覆盖willSave和didSave方法以删除然后将对象重新添加到您的集合中。

我实际上最终使用了一种不同的方法,即使用NIL上下文并提供基类来处理插入上下文。它工作得很好,是我发现的最干净的解决方案。代码可以在这里找到...... Temporary Core Data

答案 3 :(得分:0)

可能的解决方案是使用[NSManagedObjectContext obtainPermanentIDsForObjects:error:]将临时ID转换为永久ID。

但请注意,这可能会很昂贵,尤其是如果您需要以这种方式处理大量对象。