Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CoreData-在子上下文中管理文件引用_Ios_Swift_Core Data_Magicalrecord - Fatal编程技术网

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

Ios CoreData-在子上下文中管理文件引用,ios,swift,core-data,magicalrecord,Ios,Swift,Core Data,Magicalrecord,我的CoreData模型有一个具有图像属性的实体。 我始终通过将这些实体的图像存储在文件系统中并在CoreData属性(即路径)中维护对文件的引用来管理这些实体的图像 然而,我最近转向使用子托管上下文来处理编辑(这样,如果用户选择取消编辑,我可以轻松放弃更改)。 这一切都很好,但是我现在有一个跟踪任何图像更改的问题,特别是如果用户更改图像,我不能再删除旧文件(不希望文件系统中出现孤立文件)并替换为新文件,因为如果用户取消更改,旧文件现在将丢失 在我看来,我有两个选择: 我跟踪业务层中的图像更改,

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

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

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

  • 我跟踪业务层中的图像更改,仅在保存上下文后删除任何旧图像,或者在丢弃/取消上下文时删除任何新图像
  • 我将图像属性更改为二进制数据类型(选中“允许外部存储”),并让CoreData管理数据。。。在这种情况下,一切都应该正常工作
  • 寻找关于哪种方法更好、更重要、更高效的指导? 或任何其他替代解决方案/选项


    谢谢

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

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

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

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

    对于我是否会走这条路,我仍然没有100%的把握(目前正计划采用更好的图像压缩策略来缩小它们的大小,并将它们作为二进制字段存储在CoreData中)。。。但是你给了我一些很好的建议和想法,所以我们可以重新讨论一下。谢谢