Objective c 跨多个NSManagedObject上下文的NSManagedObject之间的关系

Objective c 跨多个NSManagedObject上下文的NSManagedObject之间的关系,objective-c,core-data,relationship,nsmanagedobject,nsmanagedobjectcontext,Objective C,Core Data,Relationship,Nsmanagedobject,Nsmanagedobjectcontext,我的应用程序使用多个线程,每个线程有一个托管对象上下文 为了清楚起见,我将不同的托管对象上下文称为:moc1、moc2等等 假设我们有两个模型,具有简单的一对多关系: User 1----* Document 当用户登录时,我从其中一个上下文(例如moc1)获取相应的模型 (伪代码) 然后我存储这个用户,以便以后可以引用它 在应用程序的另一部分中,我需要循环遍历数组中的数千项,并为其创建文档对象。然后,每个文档都需要绑定到当前用户。这发生在不同的后台线程中(它有自己的上下文) 正如您所看到的,

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

为了清楚起见,我将不同的托管对象上下文称为:moc1、moc2等等

假设我们有两个模型,具有简单的一对多关系:

User 1----* Document
当用户登录时,我从其中一个上下文(例如moc1)获取相应的模型

(伪代码)

然后我存储这个用户,以便以后可以引用它

在应用程序的另一部分中,我需要循环遍历数组中的数千项,并为其创建文档对象。然后,每个文档都需要绑定到当前用户。这发生在不同的后台线程中(它有自己的上下文)

正如您所看到的,我希望避免每次都必须在当前上下文中获取新用户

问题是,globallogeduser是moc1的一部分,而新文档是moc2的一部分(或moc3、moc4等,取决于线程)

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


感谢您提供的任何帮助。

您没有错,不能跨线程使用同一个NSManagedObject

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

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

    必须已保存相应的托管对象。不能将新插入的托管对象的ID传递给其他上下文

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

我认为,如果您在运行“document”循环之前使用moc2获取登录用户,您会很好,因为我不认为每次在循环中都有任何理由进行获取。(你这样做有什么原因吗?)

不要担心从线程1绑定任何东西到UserModel,从moc2获得的tempUser正在引用数据库中与globallogeduser相同的数据

UserModel *globalLoggedUser = ( Fetch the logged in user using moc1 )
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.

}