3

У меня есть NSManagedObjectContext набор, чтобы иметь NSPrivateQueueConcurrencyType, который я использую большую часть времени в моем приложении.Как сохранить ребенка NSManagedObjectContext до даты при использовании привязок

Как и я, я создал дочерний MOC с NSMainQueueConcurrencyType для использования с привязками к какао (я слышал, что привязки не работают с MOC частной очереди). Я связал некоторые ObjectController s и ArrayController с этим детским контекстом. Я очень хочу, чтобы ребенок находился в основной очереди, а не менял типы очереди MOC.

Когда я вношу изменения в связанные объекты через пользовательский интерфейс, изменения не распространяются до родительского контекста. И когда я вношу изменения в родительский контекст, они не фильтруются до Object/ArrayControllers.

Как я могу это сделать? Есть ли параметр, который будет указывать объектам/массивам управления цветом соответствующим образом обновлять их контекст и сохранять их при внесении изменений?

ответ

6

Чтобы внести изменения в родительский элемент, вам необходимо сохранить его. Если вы хотите сохранить изменения настойчиво, вам также нужно сохранить родителя после этого.

[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]; 
    }]; 
} 
+0

Разве это не означает, что каждый раз, когда я настраиваю свойство объекта через родительский MOC, мне нужно вызвать метод save для распространения изменений? Разве это не замедлит работу, поскольку они войдут в постоянный магазин? –

+0

Ваш родительский контекст имеет тип параллелизма частной очереди. Все, что вы там делаете, включая сейвы, будет выполняться в фоновом режиме. Он не будет блокировать ваш основной поток, но он заблокирует контекст и постоянный координатор хранилища, однако это может быть не проблемой для вас. – eofster

+0

Спасибо, это был действительно полезный ответ. Я подключил соответствующие IBActions, чтобы вызвать спасение ребенка, когда это необходимо, а остальное было довольно просто. –