2

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

。H

@property (nonatomic,strong) NSManagedObjectContext* managedObjectContext;

.m

 viewDidLoad {
 _managedObjectContext = [NSManagedObjectContext MR_contextForCurrentThread];
 }

问题:我是否必须将相同的托管上下文传递给我想要访问此 ManagedContexts 的所有后续视图控制器,或者我可以@property为每个新视图控制器的 .h 编写一个新的,然后在 .m 中设置每个新的视图控制器 ManagedObject_managedObjectContext = [NSManagedObjectContext MR_contextForCurrentThread];

4

2 回答 2

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)纯粹是个人喜好问题。

如果您需要额外的上下文,例如用于后台导入操作,您可以调用 eg MR_contextorMR_contextWithStoreCoordinator并将该上下文传递到任何需要的地方。

于 2013-07-23T19:52:43.137 回答
0

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

如果您需要新的上下文,请创建新的私有队列、主队列或限制上下文。

于 2013-07-23T16:24:30.583 回答