Core Data 将 objectID 传递给另一个线程

Posted

技术标签:

【中文标题】Core Data 将 objectID 传递给另一个线程【英文标题】:Core Data passing objectID to another thread 【发布时间】:2015-05-21 08:56:48 【问题描述】:

我尝试过谷歌搜索和搜索,认为这很容易找到,但我很惊讶在 Swift 中几乎没有我的问题的例子。

我有几个线程,根据我的阅读,最好为每个线程有一个单独的托管对象上下文。如果我想从另一个上下文访问一个对象,我应该传递objectID

我的问题是,我应该如何将 objectID 传递给新线程中的上下文?

以下是我的情况是如何构建的:

func doSomething(context: NSManagedObjectContext) 
    let person = Persons(context: context) // NSManagedObject

    dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)) 
        let background = (UIApplication.sharedApplication().delegate as! AppDelegate).cdh.backgroundContext!

        Birthdays(context: background, person) // NSManagedObject
        saveContext(background)
    

Birthdays 与 Persons 是一对一的关系。如果我执行这段代码,它会给我一个错误提示:

Illegal attempt to establish a relationship 'person1' between objects in different contexts

显然是因为它们处于不同的上下文中。所以我尝试通过let personsObjectID = person1.objectID 获取person1 的objectID,但我不知道应该如何使用它来将它传递给另一个线程。任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

似乎我唯一需要做的就是添加:

let person = background.objectWithID(orders.objectID as! Persons

如果我理解正确,objectWithID 从存储中获取对象并将其放入上下文中,返回托管对象。如果有人能证实这是真的,那就太好了。

func doSomething(context: NSManagedObjectContext) 
    let person = Persons(context: context) // NSManagedObject

    dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)) 
        let background = (UIApplication.sharedApplication().delegate as! AppDelegate).cdh.backgroundContext!

        let person = background.objectWithID(orders.objectID as! Persons

        Birthdays(context: background, person) // NSManagedObject
        saveContext(background)
    

【讨论】:

【参考方案2】:

Hendrik,你是对的,你应该使用 objectWithID 在所需的上下文中实例化 NSManagedObject。

【讨论】:

以上是关于Core Data 将 objectID 传递给另一个线程的主要内容,如果未能解决你的问题,请参考以下文章

如何传递 Core Data objectID 并将其与 Continuity 一起使用

如何在Core Data中使用带有fetchRequest的谓词

在 Core Data 中获取多个 objectID?

既然 objectID 在临时对象和永久对象之间发生变化,如何有效地处理 Core Data 中的临时对象?

将一个dplyr“do”函数的结果传递给另一个函数

使用 React Hooks 获取帖子并将它们作为附加道具传递给另一个组件