传递带有核心日期+魔法记录的ManagedContext

时间:2013-07-23 15:34:02

标签: objective-c sqlite core-data magicalrecord

目前我正在通过在ViewDidLoad中执行以下操作来设置我的NSManagedContext:

·H

@property (nonatomic,strong) NSManagedObjectContext* managedObjectContext;

的.m

 viewDidLoad {
 _managedObjectContext = [NSManagedObjectContext MR_contextForCurrentThread];
 }

问题:我是否必须将此相同的托管上下文传递给我希望有权访问此ManagedContexts的所有后续viewcontroller,或者我是否可以为每个写入一个新的@property新的viewcontroller的.h然后在.m中设置每个新的viewcontrollers ManagedObject _managedObjectContext = [NSManagedObjectContext MR_contextForCurrentThread];

2 个答案:

答案 0 :(得分:4)

设置Core Data堆栈后,MagicalRecord会创建“主队列并发类型”的默认上下文。如果所有视图控制器都使用此默认上下文,则可以

  • (1)将上下文从一个视图控制器传递到下一个视图控制器
  • (2)在每个视图控制器中调用[NSManagedObjectContext MR_defaultContext]来获取 默认上下文,

也可以,正如你现在所做的那样

  • (3)在[NSManagedObjectContext MR_contextForCurrentThread]中调用viewDidLoad以获取默认上下文。

但是最后一种方法的作用只是因为总是在主线程上调用viewDidLoad 在这种情况下,MR_contextForCurrentThread返回默认上下文。

但是,如果从非主要调用,MR_contextForCurrentThread会创建其他上下文(私有队列并发类型) 线程,并将上下文与固定的NSThread相关联。但是,正如@casademora正确地说的那样,这样的私有队列上下文并不总是为每个使用相同的线程 操作。所以MR_contextForCurrentThread不应该用在非主线程上, 如果从主线程调用它,它与MR_defaultContext相同。

因此,即使它适用于您的情况,您也应该避免使用方法(3)。不管你选择 方法(1)或(2)纯粹是味道问题。

如果您需要其他背景信息,例如对于后台导入操作,您可以调用 例如MR_contextMR_contextWithStoreCoordinator并将该上下文传递给其他人 这是必需的。

答案 1 :(得分:0)

请停止使用contextForCurrentThread。这对于使用GCD队列来说是双倍的。虽然GCD队列是在线程模型之上实现的,但无法保证为每个后续块获取相同的实际线程。

如果需要新上下文,请创建新的专用队列,主队列或限制上下文。