0

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

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

那么解决这个问题的最佳方法是什么?如何全局保存/缓存一个对象,然后使用同一个对象在不同的​​上下文中绑定关系,而不会产生每次都必须获取的惩罚?

感谢您的任何帮助,您可以提供。

4

1 回答 1

1

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

从核心数据编程指南:

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

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

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

  • 在接收上下文上执行 fetch。

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

不必担心从线程 1 将任何内容绑定到 UserModel,您从 moc2 获得的 tempUser 引用数据库中与 globalLoggedUser 相同的数据。

于 2012-05-06T15:45:42.787 回答