My Cocoa/Application имеет Контекст управляемого объекта в основном потоке. Когда мне нужно обновить свои данные, моя программа будет:
- Запустить новый поток
- Получить новые данные с сервера
- Создание нового управляемого объекта Контекст
- Отправьте уведомление в основной поток, чтобы объединить два контекста.
Это функция, которая получает уведомление в основном потоке
- (void)loadManagedObjectFromNotification:(NSNotification *)saveNotification
{
if ([NSThread isMainThread]) {
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification];
} else {
[self performSelectorOnMainThread:@selector(loadManagedObjectFromNotification:) withObject:saveNotification waitUntilDone:YES];
}
}
Я не получаю никаких ошибок. Моя проблема заключается в результате слияния, она фактически объединяет управляемые объекты из обоих контекстов.
My Entity - действительно простой список атрибутов и отношений.
Возможно, для слияния нужны некоторые инструкции, чтобы понять, когда обновленный управляемый объект НЕ является новым, а отредактированная версия первой. Я предполагаю, что где-то мне нужно указать способ однозначной идентификации Entity (например, атрибут может действовать как идентификатор) и что-то вроде политики слияния (если 2 управляемых объекта представляют один и тот же объект, возьмите файл с lastModificationDate больше недавнее).
Мне просто нужно понять, как правильно объединить 2 контекста, чтобы иметь одну обновленную копию для каждого объекта.
ОБНОВЛЕНИЕ 1
Теперь проблема ясна. Контекст 2 имеет большую разницу: ObjectID. Хотя контекст основного потока извлекал ManagedObjects с координатором Persistent Store, второй поток создает этот объект, выбирая удаленный URL. Даже если объекты имеют одинаковое содержимое, они будут иметь 2 разных объекта id.
У моих объектов уже был уникальный идентификатор, я мог бы использовать setObjectId, чтобы установить это значение. (Документация Apple говорит, что это НЕ хорошая идея).