CoreData - 在子上下文中管理文件引用

CoreData - Managing file references in child context

我的 CoreData 模型有一个具有图像属性的实体。 我一直通过将这些实体的图像存储在文件系统中并仅在 CoreData 属性(即路径)中维护对文件的引用来管理这些实体的图像。

不过,我最近转而使用子托管上下文来处理编辑(以便在用户选择取消编辑时我可以轻松放弃更改)。 这一切都很好,但是我现在有一个跟踪任何图像更改的问题,特别是如果用户更改图像我不能再删除旧文件(不希望在文件系统上建立孤立文件)并替换它与新文件一起使用,因为如果用户取消更改,旧文件现在将丢失。

据我所知,我有两个选择:

  1. 我跟踪我的业务层中的图像更改,并且仅在保存上下文后删除所有旧图像,或者相反地删除任何新图像,如果上下文是 discarded/cancelled。
  2. 我将我的图像属性更改为二进制数据类型(检查 'allows external storage')并让 CoreData 管理数据...在这种情况下一切都应该正常工作。

正在寻找关于哪种方法更好、更重要的是性能更高的指导? 或任何其他替代 solutions/options...

谢谢!

第一种方法会更好。如果保存是可丢弃的,那么这样做是有意义的。除非图像通常很小,否则通常最好将它们放在外部。

删除旧图像的好地方可能是托管对象的 willSave() 方法。查看 changedValues 以找到旧图像名称。如果与当前值不同,则删除旧值。

为了处理回滚更改,我想到了几种可能性。

  • 通过查看即将回滚的新实例并删除其映像文件,在回滚更改的任何代码中处理此问题。
  • 始终将新图像放在 NSTemporaryDirectory() 中,并在保存更改时使用 willSave() 将它们移动到永久位置。然后你不需要在回滚时做任何事情——你可以让 iOS 为你清除临时目录。