在Core Data中处理临时对象的最佳方法是什么?我已经看到了创建临时上下文的解决方案,它们被插入到nil上下文中等等。
然而,这是我在这两个解决方案中看到的问题。我正在使用Core Data作为我的对象模型,并且在我的一些视图中存储了一组NSData的Core Data对象。我遇到的问题是当存储对象时,objectID会更改,这会有效地使存储在任何NSSet中的任何内容无效,因为isEqual和hash现在是不同的。虽然我可以使存储在NSSet中的对象无效,但它通常不实用,当然也不容易。
以下是我考虑过的事情:
1)覆盖isEqual方法和NSManagedObject上的哈希(显然是坏的)
2)不要在NSSet中放置任何NSManagedObject(使用始终修复密钥的NSDictionary)
3)使用完全不同的类型存储在NSSet中我可以正确实现isEqual和哈希代码方法
有没有人有更好的解决方案呢?
答案 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。
但请注意,这可能会很昂贵,尤其是如果您需要以这种方式处理大量对象。