iOS核心数据乐观锁定失败误报

时间:2019-04-16 15:10:05

标签: ios core-data

在将核心数据并发调试标记设置为1的同时调试其他问题时,引起我注意的是,框架在上下文保存期间引发了一些异常。

我正在使用的应用程序大量使用后台线程和私有队列上下文来从套接字获取数据并在后台执行繁重的任务。

问题是,当我运行没有-com.apple.CoreData.ConcurrencyDebug 1环境变量的应用程序时,我没有从try context.save()

得到任何错误

例如,我设置了-com.apple.CoreData.ConcurrencyDebug 1,然后执行了一项操作并将其保存并保存。

  do {
        try context.save()
     } catch {
        log.error("Delete error: \(error)")
  }

我在optimistic lock failure上遇到了try context.save()异常

然后我继续将应用返回到触发异常的相同状态,并在没有-com.apple.CoreData.ConcurrencyDebug 1的情况下运行 并设置断点

  do {
        try context.save()
     } catch {
        log.error("Delete error: \(error)") // <--- breakpoint here
  }

与我过去遇到的其他问题不同,没有任何错误。我没有任何有关锁定原因的信息。可能有很多事情出了问题,但我无法把握这次机会弄错了哪一个。

我已经在Google上进行了广泛的搜索,关于如何从乐观锁异常中获取有意义的信息的信息并没有太多细节。

1 个答案:

答案 0 :(得分:0)

使用NSPersistentContainer时,将所有T交叉:

  • 在所有项目中搜索对viewContext的引用。确保仅在主线程上调用
  • 提防NSManagedObject'实用程序'扩展。通向善意的道路铺平了道路。扩展NSManagedObject时,如有必要,请始终参考self.managedObjectContext
  • 在线程密集型应用程序上,从mainContext读取,在后台上下文上写入。请耐心等待,不要过度更新/刷新/查询viewContext,以在UI上获得更多更新。不要脏读。
  • 当心NSFetchRequestController callBacks上的“ refreshFoo” /“ calculateBar”调用。让数据流到您的应用程序的用户界面。不要拉它。