Сбой в CoreData в - [сохранение NSManagedObjectContext:]

Примечание. Я уже проверял следующие сообщения :( Переполнение стека проблема 1 проблема переполнения стека 2

Я вижу в своем приложении следующий аварийный стек:

2  libsystem_c.dylib 0x32bc87ec _sigtramp + 48
3  CoreData          0x361a2e70 -[NSSQLCore _populateRowForOp:withObject:] + 2716
4  CoreData          0x36194ca2 -[NSSQLCore recordUpdateForObject:] + 130
5  CoreData          0x3619defc -[NSSQLCore recordChangesInContext:] + 600
6  CoreData          0x3619bfae -[NSSQLCore saveChanges:] + 286
7  CoreData          0x360f425e -[NSSQLCore executeRequest:withContext:error:] + 946
8  CoreData          0x360f3336 -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 1130
9  CoreData          0x3615b286 -[NSManagedObjectContext save:] + 522
10 MyCrashingApp     0x000aa040 -[DisplayModelMgr saveDisplayModel:forDate:] (DisplayModelMgr.m:182)

Это sigsegv, поэтому его нельзя поймать с помощью @try .. @ catch. Это происходит редко, поэтому мне любопытно, может ли это быть состояние гонки, отмеченное в комментариях между удалением и добавлением.

Код для звонка:

- (void) saveDisplayModel:(DisplayModel *)model forDate:(NSDate *)date
{
if (model == nil || date == nil)
    return;

[log debug:[model description]];

[log debug:@"DMM: saveDisplayModel: %@ lastSyncDate: %@",date, [model lastSyncDate]];

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyDisplayModel" inManagedObjectContext:self.context];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(requestDate == %@)", date];
[request setPredicate:predicate];
[request setFetchLimit:1];
[request setEntity:entity];

NSError *error = nil;
NSArray *mutableFetchResults = [self.context executeFetchRequest:request error:&error];

if (mutableFetchResults != nil) {
    [log debug:@"DMM: mutableFetchResults:count %i",[mutableFetchResults count]];
    NSDate *sDate = [[model.lastSyncDate copy] autorelease];
    NSDate *timestamp = [NSDate date];
    MyDisplayModel *coreDataModel = nil;
    if([mutableFetchResults count] > 0) {
        coreDataModel = [mutableFetchResults objectAtIndex:0];
        [coreDataModel setSyncDate:sDate];
        [coreDataModel setTimeStamp:timestamp];
        [coreDataModel setRequestDate:date];
        if(model.entries != nil && [model.entries count] > 0) {

            for(MyDisplayModelValue *existingVal in coreDataModel.values) {
                [self.context deleteObject:existingVal];
            }
        }
        [coreDataModel setValues:nil]; // race condition?
    } else {
        coreDataModel = [NSEntityDescription
                                        insertNewObjectForEntityForName:@"MyDisplayModel"
                                        inManagedObjectContext:self.context];
        [coreDataModel setSyncDate:sDate];
        [coreDataModel setTimeStamp:timestamp];
        [coreDataModel setRequestDate:date];
    }
    for(DisplayModelEntry *dmv in [model.entries allValues]) {
        MyDisplayModelValue *newDashModelVal = [NSEntityDescription
                                                  insertNewObjectForEntityForName:@"MyDisplayModelValue"
                                                  inManagedObjectContext:self.context];
        [newDashModelVal setType:[NSNumber numberWithInt:dmv.type]];
        [newDashModelVal setActual:[NSNumber numberWithInt:dmv.actual]];
        [newDashModelVal setSource:[NSNumber numberWithInt:dmv.source]];
        [newDashModelVal setTarget:[NSNumber numberWithInt:dmv.target]];
        [newDashModelVal setMymodel:coreDataModel];
        [[coreDataModel mutableSetValueForKey:@"values"] addObject:newDashModelVal]; // create new if missing?
    }
    NSError *error;
    if (![self.context save:&error]) {
        [log error:@"Error Saving Dashbaord Cache: %@",[error description]];
    }
    [self.context refreshObject:coreDataModel mergeChanges:NO];
}

}

Любые указания по этому поводу горячо приветствуются. Мы оперативно ответим на запросы на комментарии и разъяснения.


person Dru Freeman    schedule 12.10.2012    source источник
comment
У вас есть несколько потоков, использующих основные данные? Вы пробовали с включенным NSZombies?   -  person JosephH    schedule 12.10.2012
comment
Используется NSOperationQueue, но основная обработка данных выполняется после завершения операции в основном потоке. Этот сбой происходит в основном потоке. Также. Это происходит после функции BlueTooth, поэтому мы не можем запустить тест в симуляторе, чтобы заставить NSZombies работать. Также существует серьезная нехватка воспроизведения, чтобы это произошло, поэтому запускать его при отладке было невозможно.   -  person Dru Freeman    schedule 12.10.2012
comment
NSZombies можно использовать на устройстве   -  person JosephH    schedule 13.10.2012
comment
@JosephH Мне не повезло ни с переменными среды выполнения, ни с настройками времени выполнения.   -  person Dru Freeman    schedule 13.10.2012
comment
У вас это сработало?   -  person newenglander    schedule 25.01.2013