gpt4 book ai didi

cocoa - 核心数据: Synchronize data accesses with app and contained extension

转载 作者:行者123 更新时间:2023-12-03 16:57:10 26 4
gpt4 key购买 nike

我有一个 Cocoa 应用程序,其中包含 Today 扩展。我使用 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: -1856CoreData: 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)

摘自文章Sharing Data with Your Containing App在 iOS 开发库中(这不是 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.

有人能给我指出这到底意味着什么吗?

最佳答案

文章Change Management Mac Dev Library 帮助我理解了这个问题。事实证明我缺少一些关于核心数据的基本概念。

托管对象上下文有一个合并策略,默认情况下设置为NSErrorMergePolicy,这意味着它会导致错误:“无法合并更改”

其他政策选项包括:

  • NSMergeByPropertyStoreTrumpMergePolicy
  • NSMergeByPropertyObjectTrumpMergePolicy
  • NSOverwriteMergePolicy
  • NRollbackMergePolicy

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

var managedObjectContext = NSManagedObjectContext()
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

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

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

关于cocoa - 核心数据: Synchronize data accesses with app and contained extension,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28481034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com