核心数据将objectID传递给另一个线程

时间:2015-05-21 08:56:48

标签: ios multithreading swift core-data

我已经尝试过谷歌搜索和搜索SO,认为这很容易找到,但我很惊讶在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)
    }
}

生日与人有一对一的关系。如果我执行此代码,它将给出一个错误说:

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

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

2 个答案:

答案 0 :(得分: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)
    }
}

答案 1 :(得分:0)

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