我在 Apple 的文档中找不到简单、常见的模式:
- 加载核心数据存储
- 下载新数据,在内存中创建对象
- 将一些新数据保存到存储中(通常“只有新的位/未更改的位”)
相反,我可以找到这些替代方案,但没有一个是正确的:
- 不要在内存中创建对象(嗯,这意味着丢弃所有关于对象的好处。使用大量 NSDictionary 编写代码,除了解决 CoreData 的故障之外没有其他用途。一般不可行)
- 创建对象,然后删除您不想要的对象(Apple 在文档中建议这样做,但他们的通知出现严重错误:当您尝试保存时,那些“删除”会出现,即使它们不应该/不能)
- 在辅助上下文中创建对象(Apple 强烈暗示这是正确的,但显然没有提供任何方法让您将对象从临时上下文移动到真实上下文,而不执行上述操作(删除您刚刚创建的对象,然后执行保存)。这通常是不可能的,因为对象通常需要连接到新上下文中的引用,并且保存会失败)
果然,应该没这么难吧?
如果我必须编写所有代码来手动深度复制一个对象(通过向下迭代它的所有字段和数据结构),为什么 CoreData 首先存在?这是 CD 内部提供的基本功能。
到目前为止,我工作的唯一解决方案是选项 2(来自苹果的文档),当 Apple 为原本不应该保存的对象发送 NSNotifications 时,使用自定义启发式“猜测”(但 Apple 无论如何都会发送通知) )。这是一个可怕的黑客。
编辑:澄清:
我不知道如何正确发送 Apple 的通知。Apple 的代码似乎将插入转换为“更新”,将“临时对象”转换为“删除”等。我听不到“新对象”。