0

我正在使用performBlock我的NSManagedObjectContexts,以便我的更改发生在给定上下文的正确队列上。我的问题是 - 如果我要进行大量更改并从内部调用方法performBlock- 是否有一种简单的方法可以确保我使用来自正确上下文的对象。

例子:

我有一个activeAccountiVar(在 Main Queue 上创建),它是NSMangedObject应用程序中当前帐户的一个。我有一些使用activeAccount对象执行某些任务的实例方法——获取数据、设置数据。所以我的问题是,如果我在后台做某事NSManagedObjectContext并调用其中一种共享方法 - 是否有我可以使用的模式,以便在这些方法中我知道使用当前activeAccountiVar 或获取新的 iVar。另外,如果我需要做一些需要NSManagedObjectContext- 我怎么知道要获取/使用哪一个。

我知道NSManagedObjectContext使用哪个方法的一种方法是我有一个方法来检查它是否在当前线程上运行 - 然后它知道返回主线程的上下文或后台线程的上下文。另外,如果我在后台线程上,是否允许我读取位于activeAccount主线程上的对象 ID,以便我可以在后台线程上获取它的副本?提前致谢。

4

2 回答 2

0

我首先要问,你为什么要同时使用这么多上下文?

我使用一个用于后台操作,一个用于主线程。如果我需要为可丢弃的更改创建另一个,我将创建它并传递它,所以现在我的 self.managedObjectContext 指向草稿上下文。我永远不会让我的托管对象存在于他们可以访问大量上下文的范围内。

不完全清楚您是为 iOS 还是 OSX 编写,但以 iOS 为例:

如果我需要将一个新的视图控制器推送到导航堆栈中,我将初始化我的目标视图控制器的 managedObjectContext ivar 以及任何 NSManagedObject 子类实例。因为在 -prepareForSegue: 我知道我是要创建一个草稿上下文还是只传递我当前的上下文,我也知道我是否需要通过从新创建的上下文中通过它们的 ID 引用它们来初始化这些托管对象实例,或者我可以通过他们上。

现在在我的视图控制器中,我可以理所当然地认为我的托管对象总是绑定到 self.managedObjectContext。

于 2012-06-26T09:39:57.167 回答
0

布莱恩,

线程限制可能是一个很难维护的提议。您需要维护的关键是在适当的 MOC 中使用对象。由于每个托管对象都维护到其主机 MOC 及其对象 ID 的链接,因此这很容易确保。例如:

NSManagedObjectContext *newMOC = NSManagedObjectContext.new;

newMOC.persistentStoreCoordinator = oldActiveAccount.managedObjectContext.persistentStoreCoordinator;

ActiveAccount *newActiveAccount = [newMOC objectWithID: oldActiveAccount.objectID];

现在,您从中访问的每个实例newActiveAccount都是在 中创建的newMOC,因此,线程仅限于该 MOC。objectIDs是持久的。-persistentStoreCoordinator很少(如果有的话)在mainMOC. 因此,上面的代码被适当地限制了。如果源 MOC 是瞬态的,则上述技术存在问题。因此,我不能保证上述代码适用于两个背景 MOC。

安德鲁

于 2012-06-25T15:41:44.147 回答