我的应用程序使用多个线程,每个线程有一个托管对象上下文。
为清楚起见,我将不同的托管对象上下文称为:moc1,moc2,...等。
假设我们有两个简单的一对多关系模型:
User 1----* Document
当用户登录时,我从其中一个上下文中获取相应的模型(例如,moc1)。
(伪代码)
UserModel *globalLoggedUser = ( Fetch the logged in user using moc1 )
然后我存储了这个用户,以便我以后可以引用它。
在应用程序的另一部分中,我需要遍历数组中的数千个项目并为其创建Document对象。然后,每个文档都需要绑定到当前用户。这发生在不同的后台线程(具有自己的上下文)
for( NSString *documentName in documents) {
( Create new document using moc2 )
** THIS IS WHERE MY PROBLEM IS **
// What I currently do:
UserModel *tempUser = ( Fetch the logged in user using moc2 )
( bind new document to tempUser )
// What I would like to do:
( bind new document to globalLoggedUser )
// Note that in this case tempUser and globalLoggedUser are the same user, except they are attached to different contexts.
}
如您所见,我希望每次都不必将新用户提取到当前上下文中。
问题是,globalLoggedUser是moc1的一部分,而新文档是moc2的一部分(或者moc3,moc4等,取决于线程)。
那么最好的方法是什么呢?如何全局保存/缓存一个对象,然后使用同一个对象绑定不同上下文中的关系,而不必每次都要获取一个惩罚?
感谢您提供的任何帮助。
答案 0 :(得分:1)
你是正确的,你不能跨线程使用相同的NSManagedObject。
From the Core Data Programming Guide:
使用线程限制,不应在线程之间传递托管对象或托管对象上下文。要跨越线程边界从另一个上下文“传递”托管对象,您可以:
传递其对象ID(objectID)并使用objectWithID:或existingObjectWithID:error:接收托管对象上下文。
必须保存相应的托管对象 - 您无法将新插入的托管对象的ID传递给另一个上下文。
在接收上下文上执行提取。
我认为如果您在运行'document'循环之前刚刚使用moc2 获取登录用户,你会没事的,因为我没有看到任何理由每次都进行获取在循环内。 (你有什么理由这样做吗?)
不要担心从线程1将任何内容绑定到UserModel,从moc2获取的tempUser引用数据库中的相同数据作为globalLoggedUser。