我花了很多时间试图解决这个问题.
背景
我有一个简单的核心数据模型,有书籍和阅读课程.这些书的封面(图像)以"允许外部存储"存储为二进制数据.
在iOS 11.4及更低版本中,一切都运行良好.当我保存新会话时,所有内容都会正确更新.
问题
由于iOS的12,当我创建一个新的阅读会话并将其链接到这本书,大约每秒的时间,核心数据生成SQL语句也更新图书封面领域,有时会造成不好的引用(到磁盘上的文件),它通常会在重新启动应用程序时导致封面为零,并且几乎总是在磁盘上创建封面的副本(如模拟器的_EXTERNAL_DATA文件夹中所示).
内存上下文和对象保持正确(因此UI中的所有内容都可以),直到应用程序重新启动,然后封面通常为零.
iOS 12具体
在iOS 12上,我可以确定地在物理设备上重现模拟器中的错误,并且用户也报告了错误.我无法在iOS 11.4上重现错误,也没有用户报告iOS 12之前的错误.
采取的步骤
我启用了" -com.apple.CoreData.ConcurrencyDebug 1",所以不应该是我从错误的队列中访问任何东西.我也启用了" -com.apple.CoreData.SQLDebug 3",以便我可以确切地看到写入的内容.
我做了保证书的情况下(因此盖)通过我的代码以通过检查新会联想之前没有修改hasChanges,只是我之前做newSession.book = book和context.save().
为了100%肯定我没有触及任何线程上的封面属性我已经将我的getter和setter用于该属性的短路.没有得到改善.
我已经尝试objectID过在关联之前请求一本书的实例并保存.没有得到改善.
我甚至尝试了上下文保持对所有对象的强引用的选项,只是为了确保它不是某种内存管理问题.没有得到改善.
题
下一步的任何想法?
状态更新
这是iOS 12中的一个缺陷.请参阅下面接受的答案,了解有关合理解决方法的详细说明.