Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在使用绑定时使子NSManagedObjectContext保持最新_Objective C_Cocoa_Core Data_Nsmanagedobjectcontext_Cocoa Bindings - Fatal编程技术网

Objective c 如何在使用绑定时使子NSManagedObjectContext保持最新

Objective c 如何在使用绑定时使子NSManagedObjectContext保持最新,objective-c,cocoa,core-data,nsmanagedobjectcontext,cocoa-bindings,Objective C,Cocoa,Core Data,Nsmanagedobjectcontext,Cocoa Bindings,我将NSManagedObjectContext设置为NSPrivateQueueConcurrencyType,我在我的应用程序中大部分时间都在使用它 除此之外,我还使用NSMainQueueConcurrencyType创建了一个子MOC,用于cocoa绑定(我听说绑定不适用于专用队列MOC)。我已经将一些ObjectController和一个ArrayController绑定到此子上下文。我非常想让孩子留在主队列上,而不是交换MOC队列类型 当我通过UI对绑定对象进行更改时,更改不会传播到

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

除此之外,我还使用
NSMainQueueConcurrencyType
创建了一个子MOC,用于cocoa绑定(我听说绑定不适用于专用队列MOC)。我已经将一些
ObjectController
和一个
ArrayController
绑定到此子上下文。我非常想让孩子留在主队列上,而不是交换MOC队列类型

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


我怎样才能做到这一点?是否有一个设置会告诉对象/阵列控制器在进行更改时适当刷新其上下文并将其保存?

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

[child save:&error];
[parent performBlock:^{
    [parent save:&parentError];
}];
要将更改从父项带到子项,您需要使用父项的通知方法合并更改,或者在子上下文中重新获取更改。在您的情况下,合并可能更好

- (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调整对象的属性时,我都需要调用它的save方法来传播更改?这不会让事情慢一点,因为它们会进入持久性存储吗?您的父上下文是私有队列并发类型。您在那里执行的所有操作(包括保存)都将在后台队列中运行。它不会阻塞主线程,但会锁定上下文和持久存储协调器,不过这对您来说可能不是问题。谢谢,这是一个非常有用的答案。我连接了适当的iBaction以在需要时触发子级保存,其余的操作非常简单。我无法在子级上下文中进行重新获取,但合并更改确实有效。有人知道是什么原因吗?到底是什么原因不起作用?例如,在子对象中获取对象,然后在父对象中更新它(更改某些属性),然后在子对象中再次获取。因为该对象已经是一个完全实现的对象,所以第二次获取不会触及它,它只是返回它当前的状态。这就是核心数据的工作原理。它不会自动触摸完全实现的对象。但是,当您调用-mergeChangesFromContextDidSaveNotification:,对象的属性将被更新,因为您手动请求合并。