【问题标题】:How to keep a child NSManagedObjectContext up to date when using bindings使用绑定时如何使子 NSManagedObjectContext 保持最新
【发布时间】:2013-07-09 05:20:00
【问题描述】:

我将NSManagedObjectContext 设置为NSPrivateQueueConcurrencyType,我大部分时间都在我的应用程序中使用它。

除此之外,我还使用NSMainQueueConcurrencyType 创建了一个子 MOC,用于可可绑定(我听说绑定不适用于私有队列 MOC)。我已经将一些ObjectControllers 和ArrayController 绑定到这个子上下文。我非常希望将孩子保留在主队列中,而不是交换 MOC 队列类型。

当我通过 UI 对绑定对象进行更改时,这些更改不会传播到父上下文。当我对父上下文进行更改时,它们不会过滤到 Object/ArrayControllers。

我怎样才能做到这一点?是否有一个设置会告诉 Object/ArrayControllers 适当地刷新他们的上下文并在他们进行更改时保存它?

【问题讨论】:

    标签: objective-c cocoa core-data nsmanagedobjectcontext cocoa-bindings


    【解决方案1】:

    要将更改带给父级,您需要保存子级。如果要持久保存更改,还需要在此之后保存父级。

    [child save:&error];
    [parent performBlock:^{
        [parent save:&parentError];
    }];
    

    要将更改从父级带到子级,您需要使用父级NSManagedObjectContextDidSaveNotification 的通知方法合并更改或在子级上下文中重新获取。在您的情况下,合并可能会更好。

    - (void)managedObjectContextDidSave:(NSNotification *)notification {
        // Here we assume that this is a did-save notification from the parent.
        // Because parent is of private queue concurrency type, we are
        // on a background thread and can't use child (which is of main queue
        // concurrency type) directly.
        [child performBlock:^{
            [child mergeChangesFromContextDidSaveNotification:notification];
        }];
    }
    

    【讨论】:

    • 这是否意味着每次我通过父 MOC 调整对象的属性时,我都需要调用它的保存方法以传播更改?当它们进入持久存储时,这不会让事情变慢吗?
    • 你的父上下文是私有队列并发类型。您在那里所做的一切,包括保存,都将在后台队列中运行。它不会阻塞你的主线程,但它会锁定上下文和持久存储协调器,但这对你来说可能不是问题。
    • 谢谢,这是一个非常有用的答案。我连接了适当的 IBActions 以在需要时触发子保存,其余的非常简单。
    • 我无法在子上下文中重新获取工作,但合并更改可以。有谁知道是什么原因造成的?
    • 究竟是什么不工作?例如,您在子级中获取对象,然后在父级中更新它(更改某些属性),然后在子级中再次获取。因为该对象已经是一个完全实现的对象,所以第二次 fetch 不会触及它,它只是以其当前状态返回它。这就是 Core Data 的工作原理。它不会自动触及完全实现的对象。但是,当您调用 -mergeChangesFromContextDidSaveNotification: 时,对象的属性将被更新,因为您手动要求合并。
    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2021-09-04
    • 2018-01-05
    • 2011-02-15
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    相关资源
    最近更新 更多