iOS7 NSMergeConflict na Single Thread Save

Mam problemy z prostym zapisywaniem danych w aplikacji z pojedynczym wątkiem po ponownym uporządkowaniu dwóch wierszy.

Udało mi się uprościć kodowanie, aby odtworzyć błąd i byłbym wdzięczny za drugą opinię, gdy ktoś inny to wypróbuje.

Jest to sprawdzony rozsądek, ponieważ podejrzewam, że problem z danymi podstawowymi został wprowadzony w iOS 7, ponieważ działało to poprawnie w iOS 6.

Po pierwsze, uruchom nowy projekt danych podstawowych i utwórz ten model ...

Atrybut „bieżący” to opcjonalna wartość logiczna. Relacja jeden-do-wielu jest relacją uporządkowaną, tworząc NSOrderedDataset.

Teraz dodaj kilka przycisków do aplikacji; pierwszy, aby utworzyć dane (projekt i dwa powiązane „rysunki”), a drugi, aby zamienić dwa rysunki, a następnie ustawić właściwość w pierwszym rysunku.

Oto kod ...

-(IBAction)onTestButton:(id)sender
{
    id delegate = [[UIApplication sharedApplication]delegate];
    NSManagedObjectContext *managedObjectContext = [delegate managedObjectContext];

    self.project = [NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:managedObjectContext];
    Drawing *drawing1 = [NSEntityDescription insertNewObjectForEntityForName:@"Drawing" inManagedObjectContext:managedObjectContext];
    Drawing *drawing2 = [NSEntityDescription insertNewObjectForEntityForName:@"Drawing" inManagedObjectContext:managedObjectContext];

    NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.project.drawings];
    [tempSet addObject:drawing1];
    [tempSet addObject:drawing2];
    self.project.drawings = tempSet;

    [self save];
}

-(IBAction)onTestButton2:(id)sender
{
    NSMutableOrderedSet *exchange = [self.project mutableOrderedSetValueForKey:@"drawings"];
    [exchange exchangeObjectAtIndex:0 withObjectAtIndex:1];
    self.project.drawings = exchange;

    [self save];

    Drawing *drawing = [self.project.drawings objectAtIndex:0];

    BOOL current = [drawing.current boolValue];
    drawing.current = [NSNumber numberWithBool:!current];

    [self save];
}

-(void)save
{
    id delegate = [[UIApplication sharedApplication]delegate];
    NSManagedObjectContext *managedObjectContext = [delegate managedObjectContext];
    NSError *error = nil;

    if( ![managedObjectContext save:&error] )
    {
        NSLog(@"%@ Save: Unresolved Error on Save %@", error, [error userInfo] );
        abort();
    }
}

Teraz przetestuj, naciskając pierwszy przycisk testowy. To ustawia dane.

Następnie naciśnij drugi przycisk testowy .... wszystko OK !!!

Teraz naciśnij drugi przycisk testowyjeszcze raz i BANG. Powinieneś otrzymać błąd NSMergeConflict podobny do tego ....

Zapisz: Nierozwiązany błąd na Save {conflictList = ("NSMergeConflict (0x8a7d0b0) dla NSManagedObject (0x8bedfa0) z objectID '0x8bd9340' z oldVersion = 1 i newVersion = 2 oraz stary snapshot obiektu = {
current = ""; n project = "0x8bc3f50"; n} i nowy buforowany wiersz = {n current = "; n; project =" 0x8aa88c0 "; n}") ;

Z błędu zauważyłem, że zmienił się obiekt mojego projektu. Jest to jednak aplikacja z jednym wątkiem wykorzystująca główny kontekst aplikacji.

Spędziłem na tym zbyt wiele czasu i byłbym wdzięczny komuś, kto komentuje, gdzie jest problem. Czy to błąd związany z danymi podstawowymi, czy też jestem właściwym „głupcem”?

Wielkie dzięki

/Pasować do

questionAnswers(1)

yourAnswerToTheQuestion