objective-c - 传递带有核心日期 + Magical Record 的 ManagedContext

标签 objective-c sqlite core-data magicalrecord

目前,我正在通过在 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_contextMR_contextWithStoreCoordinator 并将该上下文传递到任何地方 这是必需的。

关于objective-c - 传递带有核心日期 + Magical Record 的 ManagedContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17814656/

相关文章:

ios - 在 iOS 中解析时在 SQLite 中批量存储

ios - 注册接收远程 CloudKit 更改通知不起作用

ios - 如何向 UILabel 的固有内容大小添加填充?

iphone - UILabels 未显示在 UIView 的子类中

mysql - 如何查询 has_many 关联表的参数?

ios - NSDateFormatter 减少日期的日期

ios - 动态对象的调用方法

ios - 按值过滤具有可变键的数据

java - 将 TimePicker 数据保存在 sqlite 数据库中

entity-framework - SQLite 与 EF 代码优先