【问题标题】:CoreData - Managing file references in child contextCoreData - 在子上下文中管理文件引用
【发布时间】:2018-05-08 00:58:20
【问题描述】:

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

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

在我看来,我有两个选择:

  1. 我跟踪业务层中的图像更改,仅在保存上下文后删除任何旧图像,或者如果上下文被丢弃/取消,则反过来删除任何新图像。
  2. 我将图像属性更改为二进制数据类型(选中“允许外部存储”)并让 CoreData 管理数据...在这种情况下,一切都应该正常工作。

正在寻找关于哪种方法更好,更重要的是 - 性能更高的任何指导? 或任何其他替代解决方案/选项...

谢谢!

【问题讨论】:

    标签: ios swift core-data magicalrecord


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我是否会走这条路仍然不是 100%(目前计划采用更好的图像压缩策略来减小它们的大小并将它们作为二进制字段存储在 CoreData 中)......但你有给了我一些好的提示和想法,所以可能会重新审视这个。谢谢
    猜你喜欢
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2022-07-26
    • 1970-01-01
    • 2020-07-13
    • 2011-05-08
    • 2018-08-30
    相关资源
    最近更新 更多