【问题标题】:Passing a ManagedContext with Core Date + Magical Record传递带有核心日期 + 神奇记录的 ManagedContext
【发布时间】:2013-07-24 03:52:43
【问题描述】:

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

.h

@property (nonatomic,strong) NSManagedObjectContext* managedObjectContext;

.m

 viewDidLoad {
 _managedObjectContext = [NSManagedObjectContext MR_contextForCurrentThread];
 }

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

【问题讨论】:

    标签: objective-c sqlite core-data magicalrecord


    【解决方案1】:

    Core Data 栈建立后,MagicalRecord 会创建一个“主队列并发类型”的默认上下文。如果你所有的视图控制器都使用这个默认上下文,你可以

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

    你也可以,就像你现在做的那样

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

    但最后一种方法之所以有效,是因为viewDidLoad 总是在主线程上调用,并且 MR_contextForCurrentThread 在这种情况下返回默认上下文。

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

    因此,即使它适用于您的情况,您也应该避免方法(3)。无论您选择 方法(1)或(2)纯粹是个人喜好问题。

    如果您需要额外的上下文,例如对于后台导入操作,您可以调用 例如MR_contextMR_contextWithStoreCoordinator 并将该上下文传递给任何地方 这是必需的。

    【讨论】:

    • 非常感谢您抽出宝贵时间撰写周到的答案。我现在对此有了更好的理解:)
    • @MartinR 为什么不应该为后台操作调用 MR_contextForCurrentThread ?难道我们不使用私有队列并发类型来保存父上下文(在这种情况下为主线程上下文)的背景更改吗? [假设我们想要该线程的不同上下文]
    • @user1349663: 私有队列 MOC 使用单独的调度 queue 并且 queuesthreads.
    【解决方案2】:

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

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

    【讨论】:

    • 您介意解释一下我将如何创建一个新的私人队列吗?为整个应用实例化一个,然后将这个队列相应地传递给各种控制器是否有意义?
    • 是的,私人队列会是什么样子?
    • 是否可以在主线程上创建另一个 MOC 以在您制作/收听 UI 更新时使用?如果更新/编辑被取消,那么就把它扔掉?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多