如何解决如何解决Swift中的“核心数据非法尝试建立关系”问题?
我获得了以下代码:
let result = try decoder.decode([T].self,from: data)
if let box = Box.item(for: identifier,inContext: context),let newTokens = result as? [Token] {
// Mark all OldTokens that are not inside NewTokens as toBeDeleted
if let oldTokens = box.token?.allObjects as? [Token] {
for oldToken in oldTokens {
if !newTokens.contains(where: { $0.identifier == oldToken.identifier }) {
oldToken.toBeDelete = true
}
}
// Update / Add all Tokens in newTokens to Database
for newToken in newTokens {
var oldToken = oldTokens.filter({ $0.identifier == newToken.identifier }).first
if oldToken != nil {
guard let toBeDeleted = oldToken?.toBeDelete else { fatalError() }
oldToken = newToken
oldToken?.toBeDelete = toBeDeleted
oldToken?.box = box
} else {
newToken.toBeDelete = false
newToken.box = box
}
}
}
}
try? context.save()
completion(.success(result))
代码应执行的操作: 我们从服务器上获得了一些令牌,并希望将其保存在CoreData数据库中。在数据库内部但不在后端结果内部的令牌将被标记为toBeDeleted。两者中的令牌将被更新,而新的令牌将被写入数据库。
问题:
我遇到了"Core data Illegal attempt to establish a relationship"
错误。在我的理解错误中,我尝试在2个不同的上下文中执行CoreData Stuff。
当我执行newToken.box = box
时,将触发错误。至少我是这样相信的。
我认为我在newTokens = result as? [Token]
中得到了一个不同的上下文,而在box.token?.allObjects as? [Token]
中得到了另一个上下文。
可悲的是,我没有解决这些问题的方法,需要一种在相同背景下做到这一点的方法。
我尝试过的事情:
我试图将所有东西都包装在Dispatchqueue.main.async
中,但没有帮助。有任何想法吗?
感谢帮助
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。