Срив в CoreData в -[NSManagedObjectContext save:]

Забележка, вече проверих следните публикации:(Препълване на стека проблем 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