NSMergeConflict проблема, когда зафиксировать поток? - PullRequest
0 голосов
/ 09 сентября 2011

Я выполняю некоторую функцию, которая будет загружать данные из MyAPI и повторно сохранять данные ядра

пример

=============================

            =========================

может быть таким временем .. Когда функция еще не закончена, я вызываю этот метод снова и снова в другом потоке

, когда я фиксирую этопоток с этой функцией

+(void)commit {
// get the moc for this thread
NSManagedObjectContext *moc = [self managedObjectContext];
NSThread *thread = [NSThread currentThread];

DLog(@"threadKey commit%@" , [[self class]threadKey]);

if ([thread isMainThread] == NO) {
    // only observe notifications other than the main thread
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:moc];
}

NSError *error;
if (![moc save:&error]) {
    DLog(@"Error in Saving %@", error);
    dispatch_async(dispatch_get_main_queue(), ^{
        //NSString * temp= [NSString stringWithFormat: @"There is error In Saving.. Contact us! :P",error];
        //[[BNUtilitiesQuick UtilitiesQuick] Alert:temp];
    });
}

if ([thread isMainThread] == NO) {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:moc];

}

}

(этот код для сохранения всех данных в кэш ..)

есть ошибка, ошибка, подобная этой

"NSMergeConflict (0x1205b7f0) for NSManagedObject (0x10900d70) with objectID 
'0x10cad920 <x-coredata://60AE38D6-EE4C-4FE1-9B9A-5322E301E7D5/City/p2>' with oldVersion = 20 and newVersion = 21 and old object snapshot = 
{\n    Country = \"0x10611dd0 <x-coredata://60AE38D6-EE4C-4FE1-9B9A-5322E301E7D5/Country/p1>\";\n    Name = \"Jakarta Barat\";\n} and new cached row = 
{\n    Country = \"0x1019e1f0 <x-coredata://60AE38D6-EE4C-4FE1-9B9A-5322E301E7D5/Country/p1>\";\n    Name = \"Jakarta Barat\";\n}"

Кто-нибудь может сказать мне, что это за ошибка?

Например, что такое 0x10611dd0?Это место в памяти?

Что такое идентификатор данных ядра?

Как ошибка все равно появляется?Похоже, coredata пытается объединить изменения, которые уже одинаковы.

Да, несколько потоков одновременно управляют РАЗЛИЧНЫМИ управляемыми объектами контекста.Все эти coredata имеют одно и то же постоянное хранилище.

1 Ответ

0 голосов
/ 20 октября 2011

Проблема в том, что вы пытаетесь объединить два объекта с одинаковым идентификатором объекта, но разными значениями для страны.Шестнадцатеричное число после страны - это адрес этого свойства, поэтому кажется, что для страны заданы два разных объекта, и это вызывает ошибку объединения.

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