核心数据:同步数据访问与应用程序和包含的扩展

Core Data: Synchronize data accesses with app and contained extension

我有一个 Cocoa 应用程序,其中包含 Today Extension。我使用 Core Data (SQLite) 在这两者之间存储和共享数据。两个应用程序共享一个组容器以访问相同的数据存储。这两个应用程序不仅读取而且写入导致问题的数据。有时,其中一个应用程序会抛出错误。到目前为止,我遇到了三种不同的错误类型:

Could not merge changes


Error in CoreDragRemoveTrackingHandler: -1856

Error in CoreDragRemoveReceiveHandler: -1856


CoreData: error: NULL _cd_rawData but the object is not being turned into a fault


Error in CoreDragRemoveReceiveHandler: -1856 CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[__NSCFSet addObject:]: attempt to insert nil with userInfo (null)

来自 iOS 开发库中的文章 Sharing Data with Your Containing App(这不是 iOS/Cocoa-Touch,而是 OSX/Cocoa - 但同样适用)我了解到:

To avoid data corruption, you must synchronize data accesses. Use Core Data, SQLite, or Posix locks to help coordinate data access in a shared container.

谁能告诉我这到底是什么意思?

Mac 开发库中的文章 Change Management 帮助我理解了这个问题。原来我遗漏了一些关于 Core Data 的基本概念。

托管对象上下文有一个合并策略,默认设置为NSErrorMergePolicy,意味着它会导致错误:"Could not merge changes"

其他政策选项是:

  • NSMergeByPropertyStoreTrumpMergePolicy
  • NSMergeByPropertyObjectTrumpMergePolicy
  • NSOverwriteMergePolicy
  • NSRollbackMergePolicy

在我的例子中,设置 NSMergeByPropertyObjectTrumpMergePolicy 是最好的解决方案。 Swift 中的示例实现:

var managedObjectContext = NSManagedObjectContext()
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

还有其他概念,例如通过 NSManagedObjectContextDidSave 的通知。但我不确定这是否适用于两个不同的应用程序。

我还不确定其他错误。合并冲突是唯一可重现的案例。其他问题在两周内只出现过一两次。我认为这些与合并冲突无关。如果再次发生,我会更新答案。