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