如何解决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 (将#修改为@)