2012-04-14 11 views
3

Ich verwende einen Hintergrund-Thread, um eine begrenzte Anzahl von Datensätzen mit Datum sortiert abzurufen.IOS Core Daten Fetch-Anfrage - Sortierung

Alles funktioniert gut, bis ich einen Datensatz im UI-Thread (Tabellenansicht) löschen.

//this is done in the background thread 
NSFetchRequest *frequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" 
              inManagedObjectContext:self.managedObjectContext]; 
[frequest setEntity:entity]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] 
            initWithKey:@"date"  
            ascending:NO]; 

NSArray *descriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[frequest setSortDescriptors:descriptors]; 

[frequest setFetchOffset:fetchOffset];  
[frequest setFetchLimit:20]; 

[frequest setResultType:NSManagedObjectIDResultType]; 

NSError *fetchError; 
NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:frequest 
                       error:&fetchError] mutableCopy]; 

Der Hintergrund-Thread wird für NSManagedObjectContextDidSaveNotification registriert und führt die folgenden Selektor

//this is done in the background thread 
-(void) didSavePersistenceStore:(NSNotification *)notification 
{ 
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification]; 
} 

Das Problem: Nach dem Löschen eines Datensatzes, nachfolgende Abruf Ergebnisse sind nicht mehr mit dem Datum sortiert.

Was fehlt mir?

+0

Ihr Code ist korrekt. IMHO, der Fehler muss woanders liegen. – Mundi

+0

Diese Benachrichtigung wird durch den Hauptthread ausgelöst und bewirkt, dass 'mergeChangesFromContextDidSaveNotification:' auf dem Hauptthread ausgeführt wird, der nicht der richtige Thread ist. Keine Ahnung, ob dies das Problem verursacht, aber es klingt sicher, als könnten einige kleine Fehler auftreten –

+0

Das Ziel für mergeChangesFromContextDidSaveNotification ist der ManagedObjectContext, der dem Hintergrundthread zugeordnet ist. Ist es wichtig, welcher Thread die Nachricht in diesem Fall aufruft? – Sammy

Antwort

0

Stellen Sie zuerst sicher, dass Sie den managedObjectContext nicht aus dem falschen Thread verwenden. Sie können performBlock aufrufen, um es im richtigen Kontext auszuführen.

Zweitens bleibt der Abrufdeskriptor, den Sie für den Abruf verwenden, nicht erhalten. Wenn Sie also nicht mit den gleichen Sortierkriterien fortfahren, werden Sie es nicht so bekommen.

Wenn Sie dieses Verhalten möchten, verwenden Sie einen Abrufergebnis-Controller. Es wird Ihre gewünschte Ansicht in der Datenbank beibehalten.

0

Von Apple-Dokumentation:

If you set the value to NSManagedObjectIDResultType, this will demote any sort orderings to “best efforts” hints if you do not include the property values in the request.

Sie müssen alle Änderungen an persistenten Speicher oder setzen includesPendingChanges auf NO schreiben.