这是一个复杂的问题。我们有一个 IOS 应用程序有时会在后台运行一个长时间运行的任务,更新数据库。使用创建单独管理的对象上下文并共享持久存储协调器。
我们还添加通知侦听器并将更改通知传递给相关上下文 processPendingChanges 方法。(双向处理)
我们看到的是后台线程正在删除几个对象——而不是在一个事务中。后台线程完成并保存所有更改。然后在执行回滚的前台执行操作。
这导致一些已删除的对象重新出现。(executeFetchRequest 找到它们。)这些对象无效,使用它们会使应用程序崩溃。
仅当前台上下文在后台线程删除它们之前的某个时间访问了这些对象时,才会发生这种情况。(即它们在缓存中。)我已经检查以确保来自后台的更改通知正在发送到前台上下文,并且正在前台线程上进行处理。
我已经验证了在调用回滚之前这些对象不存在于前台上下文中,并且在回滚之后它们确实存在。(但并不完全有效。)当前台上下文从后台上下文接收到更改通知时,它似乎并没有从它的缓存中删除已删除的对象。