Конфликт слияния основных данных при сохранении из второго потока - PullRequest
3 голосов
/ 21 декабря 2011

У меня есть две сущности в моей модели базовых данных. Entity1 и Entity2. Entity1 имеет отношение один к одному, которое связано с Entity2. Когда я открываю / сохраняю объекты в одном потоке, все работает нормально

Теперь я начинаю использовать фоновый поток для некоторой обработки. Я передаю NSManagedObjectID моего entity1 во второй поток, а также передаю NSPersistentStoreCoordinator во второй поток. Второй поток создает новый managedObjectContext, загружает entity1 с использованием managedObjectID, а затем загружает entity2 с помощью Relationship from entity1. Кажется, все это работает, и я могу получить доступ к entity2.

Однако, если я хочу изменить entity2, когда я сохраняю изменения, я получаю ошибку конфликта слияния "Операция не может быть завершена. (Ошибка Какао 133020.)". Глядя на сообщение об ошибке, единственное, что отличается между «до» и «после», это ссылка на entity2, которая указывает на entity1. В этом случае ничто другое не отличается (я сохраняю, хотя я не изменил другие атрибуты). Это имеет смысл для меня, потому что entity1 в моем потоке2 - это другой объект, чем entity1 в моем потоке1 ... поэтому ссылка на него должна отличаться.

Так как же я могу сохранить данные из моего потока 2? Кажется, эта ссылка всегда будет отличаться между двумя моими потоками ...

Любые предложения будут полезны! Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 03 сентября 2013

Вы можете редактировать то, что происходит в случае конфликта слияния, устанавливая политику NSMerge в контексте вашего управляемого объекта.Подробности см. В документации:

https://developer.apple.com/library/ios/documentation/CoreData/Reference/NSMergePolicy_Class/Reference/Reference.html#jumpTo_8

Код будет выглядеть следующим образом:

- (void)saveContext {
    /* save changes to context */
    NSManagedObjectContext *context = [self managedObjectContext];
    NSMergePolicy *mergePolicy = [[NSMergePolicy alloc] initWithMergeType:NSMergeByPropertyStoreTrumpMergePolicyType];
    [context setMergePolicy:mergePolicy];

    NSError *error = nil;
    if ([context save:&error]) {
    } else {
        NSLog(@"The save wasn't successful: %@", [error userInfo]);
    }
}
1 голос
/ 21 декабря 2011

Поработав еще немного, я понял, что неправильно отслеживал изменения между потоками (как описано здесь: https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/Articles/cdConcurrency.html#//apple_ref/doc/uid/TP40003385-SW1). Я реализую это более подробно и посмотрю, исправит ли это что-то.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...