如何解决NSMergeConflict与oldVersion和newVersion报告为相等
我最近设法在我的代码中捕获了一个极其罕见的异常,希望这里的人们可以帮助我理解它。我有一个游戏,它跟踪经过的时间并每秒将其值保存到Core Data中。同时,用户可能正在玩游戏并导致分数更新,该分数也保存在Core Data中。我怀疑我应该序列化保存,但是目前我还没有。一切正常,在99.99%的时间内都可以正常运行,但是有时context.save()
的调用会引发异常。
我的合并策略设置为:
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
这是我节省经过时间的方法。相同的模式用于更新玩家的分数。
func saveElapsedTime() {
let container = (UIApplication.shared.delegate as! AppDelegate).persistentContainer
container.performBackgroundTask() { (context) in
let storedGame = context.object(with: self.storedGameID) as! StoredGame
storedGame.elapsedTime = Int32(self.elapsedTime)
do {
try context.save()
} catch let nserror as NSError {
print("saveElapsedTime: failed to save: \(nserror). userInfo: \(nserror.userInfo).")
}
}
}
我能够捕获的罕见错误如下:
Error Domain=NSCocoaErrorDomain Code=133020 "Could not resolve merge changes."
<snip>...with oldVersion = 463 and newVersion = 463...<snip>
我已经看到很多帖子,其中新旧版本相差一到几个,并且人们建议设置与默认版本不同的合并策略。我猜测在oldVersion == newVersion的情况下,这是因为多个线程正试图同时保存。有人可以仅通过查看错误消息来确认这一点吗?我是否应该使用OperationQueue来序列化所有保存,例如以下示例:NSPersistentContainer concurrency for saving to core data?
谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。