Core data 核心数据-从NSManagedObjectContext peformBlock调用的共享代码:

Core data 核心数据-从NSManagedObjectContext peformBlock调用的共享代码:,core-data,concurrency,nsmanagedobject,nsmanagedobjectcontext,Core Data,Concurrency,Nsmanagedobject,Nsmanagedobjectcontext,我正在NSManagedObjectContext上使用performBlock,以便在给定上下文的正确队列上进行更改。我的问题是——如果我在performBlock中做了很多更改并调用了很多方法——是否有一种简单的方法可以确保我从正确的上下文中使用对象 例如: 我在主队列上创建了一个activeAccount iVar,该队列是应用程序中当前帐户的NSMangedObject。我有一些实例方法,它们使用activeAccount对象来执行某些任务—获取数据、设置数据。所以我的问题是,如果我在后

我正在NSManagedObjectContext上使用performBlock,以便在给定上下文的正确队列上进行更改。我的问题是——如果我在performBlock中做了很多更改并调用了很多方法——是否有一种简单的方法可以确保我从正确的上下文中使用对象

例如:

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

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

布莱恩

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

NSManagedObjectContext *newMOC = NSManagedObjectContext.new;

newMOC.persistentStoreCoordinator = oldActiveAccount.managedObjectContext.persistentStoreCoordinator;

ActiveAccount *newActiveAccount = [newMOC objectWithID: oldActiveAccount.objectID];
现在,您从newActiveAccount访问的每个实例都是在newMOC中创建的,因此,线程仅限于该MOC。objectid是持久的。mainMOC上的-persistentStoreCoordinator很少(如果有)更改。因此,上述代码受到适当限制。如果源MOC是瞬态的,则上述技术存在问题。因此,我不能保证上述代码适用于两个背景MOC


Andrew

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

我使用一个用于后台操作,一个用于主线程。如果我需要为可丢弃的更改创建另一个,我只需要创建它并传递它,因此现在我的self.managedObjectContext指向草稿上下文。我决不会让我的托管对象生活在可以访问多种上下文的范围内

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

NSManagedObjectContext *newMOC = NSManagedObjectContext.new;

newMOC.persistentStoreCoordinator = oldActiveAccount.managedObjectContext.persistentStoreCoordinator;

ActiveAccount *newActiveAccount = [newMOC objectWithID: oldActiveAccount.objectID];
如果需要将新的视图控制器推入导航堆栈,我将初始化目标视图控制器的managedObjectContext ivar以及任何NSManagedObject子类实例。由于in-prepareforsgue:我知道是创建草稿上下文还是只传递当前上下文,我还知道是否需要通过从新创建的上下文中引用这些托管对象实例的ID来初始化它们,或者只传递它们


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

我正在为iOS开发。我实际上只有两个MOC,一个用于主线程,一个用于后台运行。我想我的问题是,我有我试图重用的代码,所以我把它们放进了方法中。但我不想说方法X只能在这个ManagedObjectContext中运行。在一个案例中,我正在与account建立新的关系。包含此项的对象具有帐户iVar。因此,我试图决定是否可以加入iVar,或者是否必须为后台MOC创建另一个account对象。也许我需要将每个方法限制在给定的MOC内。