swift - 如何在 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 数据库中。位于 DB 内但不在 Backend Result 内的令牌将被标记为 toBeDeleted。Both 中的令牌将被更新,新的令牌将写入数据库。
问题:
我得到了一个"Core data Illegal attempt to establish a relationship"
错误。在我理解错误的意思中,我尝试在 2 个不同的上下文中执行 CoreData Stuff。当我这样做时newToken.box = box
,将触发错误。这是我至少相信的。
我想我有一个不同的 ContextnewTokens = result as? [Token]
和另一个box.token?.allObjects as? [Token]
.
可悲的是,我还没有解决这些问题的方法,需要一种方法来在相同的情况下解决这个问题。
我尝试过的:
我试图将所有东西都包裹在里面,Dispatchqueue.main.async
但没有帮助。有任何想法吗 ?
谢谢您的帮助
解决方案
推荐阅读
- python - 如何在 Python 中将经过的时间字符串转换为秒
- mongodb - Gitlab CI中的Mongodb连接
- javascript - 如何通过 Sequelize 连接多个数据库?
- sql - 在 SQL Server 2008 中存储为图像数据类型的长文本的关键字搜索
- javascript - React 递归函数以渲染组件
- php - 使 nginx 在子目录中与 symfony 一起工作时遇到问题
- google-chrome - 为什么我的预检请求在 Firefox 中使用 axios 制作的 http DELETE 请求返回 400?
- amazon-web-services - 如何遍历 terraform 中的地图变量
- verilog - 100 位二进制纹波进位加法
- sql - 如何在 SQL Server 中比较两列的相似性?