跨多个NSManagedObjectContexts的NSManagedObject之间的关系

时间:2012-05-05 16:00:49

标签: objective-c core-data relationship nsmanagedobject nsmanagedobjectcontext

我的应用程序使用多个线程,每个线程有一个托管对象上下文。

为清楚起见,我将不同的托管对象上下文称为: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等,取决于线程)。

那么最好的方法是什么呢?如何全局保存/缓存一个对象,然后使用同一个对象绑定不同上下文中的关系,而不必每次都要获取一个惩罚?

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

你是正确的,你不能跨线程使用相同的NSManagedObject。

From the Core Data Programming Guide:

  

使用线程限制,不应在线程之间传递托管对象或托管对象上下文。要跨越线程边界从另一个上下文“传递”托管对象,您可以:

     
      
  • 传递其对象ID(objectID)并使用objectWithID:或existingObjectWithID:error:接收托管对象上下文。

         

    必须保存相应的托管对象 - 您无法将新插入的托管对象的ID传递给另一个上下文。

  •   
  • 在接收上下文上执行提取。

  •   

我认为如果您在运行'document'循环之前刚刚使用moc2 获取登录用户,你会没事的,因为我没有看到任何理由每次都进行获取在循环内。 (你有什么理由这样做吗?)

不要担心从线程1将任何内容绑定到UserModel,从moc2获取的tempUser引用数据库中的相同数据作为globalLoggedUser。