目前,我正在通过在 ViewDidLoad 中执行以下操作来设置 NSManagedContext:
.h
@property (nonatomic,strong) NSManagedObjectContext* managedObjectContext;
.m
viewDidLoad {
_managedObjectContext = [NSManagedObjectContext MR_contextForCurrentThread];
}
问题:我是否必须将这个相同的托管上下文传递给我想要访问此 ManagedContexts 的所有后续 View Controller ,或者我可以编写一个新的 @property
为每个新 View Controller 的 .h,然后在 .m 中设置每个新 View Controller 的 ManagedObject,其中 _managementObjectContext = [NSManagedObjectContext MR_contextForCurrentThread];
最佳答案
当核心数据堆栈建立时,MagicalRecord 会创建一个“主队列并发类型”的默认上下文。如果您的所有 View Controller 都使用此默认上下文,您可以
- (1) 将上下文从一个 View Controller 传递到下一个 View Controller ,
- (2) 在每个 View Controller 中调用
[NSManagedObjectContext MR_defaultContext]
来获取 默认上下文,
您也可以,就像您目前所做的那样
- (3) 在
viewDidLoad
中调用[NSManagedObjectContext MR_contextForCurrentThread]
获取默认上下文。
但最后一个方法之所以有效,只是因为 viewDidLoad
始终在主线程上调用,并且
MR_contextForCurrentThread
在这种情况下返回默认上下文。
但是,如果从非主线程调用,MR_contextForCurrentThread
会创建额外的上下文(私有(private)队列并发类型)
线程,并将上下文与固定的 NSThread 相关联。但是,正如 @casademora 正确所说,这样的私有(private)队列上下文并不总是为每个队列使用相同的线程
手术。因此 MR_contextForCurrentThread
不应该在非主线程上使用,
如果从主线程调用,它与 MR_defaultContext 相同。
因此,即使它适用于您的情况,您也应该避免方法 (3)。无论你选择 方法(1)或(2)纯粹是个人喜好问题。
如果您需要额外的上下文,例如对于后台导入操作,您可以调用
例如MR_context
或 MR_contextWithStoreCoordinator
并将该上下文传递到任何地方
这是必需的。
关于objective-c - 传递带有核心日期 + Magical Record 的 ManagedContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17814656/