我已经尝试过谷歌搜索和搜索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,但我不知道应该如何使用它将它传递给另一个线程。任何帮助表示赞赏。
答案 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。