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的谓词