首页 > 解决方案 > 如何在 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但没有帮助。有任何想法吗 ?

谢谢您的帮助

标签: swiftdatabasecore-datansmanagedobjectnsmanagedobjectcontext

解决方案


推荐阅读