NSFetchedResultsController zeigt keine Aktualisierungen aus einem anderen Kontext an
ich habe einNSFetchedResultsController
und einige Operationen aktualisieren verwaltete Objekte auf separaten Threads überNSOperationQueue
.
Der FRC (mit seinem Prädikat) sieht folgendermaßen aus:
<code>- (NSFetchedResultsController*)fetchedResultsController { if(fetchedResultsController) return fetchedResultsController; NSManagedObjectContext* mainContext = [self managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:[NSEntityDescription entityForName:@"Check" inManagedObjectContext:mainContext]]; [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"isSync == %@", [NSNumber numberWithBool:NO]]]; [fetchRequest setFetchBatchSize:10]; fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:mainContext sectionNameKeyPath:nil cacheName:nil]; fetchedResultsController.delegate = self; [fetchRequest release], fetchRequest = nil; return fetchedResultsController; } </code>
Der Haupt-Thread und der Thread-Vorgang haben ihre eigenen verwalteten Objektkontexte. Sie teilen nur den gleichen Koordinator.
Innerhalb der Thread-Operation ändere ich dieisSync
Eigentum vonNO
zuYES
. Um zu wissen, was istCheck
Entität zu aktualisieren, wird der Hauptkontext an die Thread-a übergebenNSManagedObjectID
. Die Thread-Operation ruft das verwaltete Objekt wie folgt ab:
<code>-(void)main { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSManagedObjectContext *exportContext = [[NSManagedObjectContext alloc] init]; [exportContext setPersistentStoreCoordinator:[self persistentStoreCoordinator]]; //... Check* check = (Check*)[exportContext existingObjectWithID:objID error:&error]; check.isSync = [NSNumber numberWithBool:YES]; //... [exportContext save:&error]; [pool release], pool = nil; } </code>
Wenn die Thread-Operation a aufruftsave
dasmergeChangesFromContextDidSaveNotification
Die Benachrichtigung wird aufgerufen und der Hauptkontext führt die Änderungen zusammen.
<code>- (void)contextChanged:(NSNotification*)notification { if ([notification object] == [self managedObjectContext]) return; if (![NSThread isMainThread]) { [self performSelectorOnMainThread:@selector(contextChanged:) withObject:notification waitUntilDone:YES]; return; } [[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification]; } </code>
Protokollierung der Beschreibung desnotification
überprüft, ob die Änderungen korrekt durchgeführt wurden.
Mein Problem
Delegiert Methoden vonNSFetchedResultsControllerDelegate
werden nicht gerufen.
Dies ist ziemlich seltsam, da der Umgang mit demselben Kontext, dem Hauptkontext, das Abhören von Änderungen ermöglicht und Delegate-Methoden aufgerufen werden, z. Löschen eines Zeilenobjekts in derUITableView
.
Ich habe einige Themen auf SO mit dem gleichen Problem gefunden. Ich habe alle Problemumgehungen ausprobiert, kann jedoch keine wertvolle Lösung finden:
NSFetchedResultsController zeigt keine Aktualisierungen aus anderen Kontexten an
Danke im Voraus.
Bearbeiten
Der obige Code funktionierte in einem früheren Modell. Dann habe ich ein neues Modell erstellt, das Objekte aus dem vorherigen kopiert (und einfügt), und jetzt funktioniert es nicht mehr.
Vorschläge?
Bearbeiten 2
Dies ist das Prädikat, in dem ich verwendeNSFetchedResultsController
Getter. Es ist meine Schuld, aber als ich den Beitrag schrieb, habe ich ihn nicht kopiert.
<code>NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"insertionDate" ascending:NO]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; // previous code here [fetchRequest setSortDescriptors:sortDescriptors]; </code>
Nun ungefährJody letzter Kommentar
In main () Ihrer NSOperation laden Sie neue Objekte, und dort scheint es, als würden Sie isSync für jedes neue Objekt auf YES setzen. Das Prädikat, das Sie für den fetchedResultsController verwenden, sucht nur nach Objekten mit isSync == NO.
Ich erwarte das bei der ImmobilieisSync
ist auf YES gesetzt, dieNSFetchedResultsController
beobachtet, dass sich Zeilen ändern und entfernen, die nicht mit dem Prädikat übereinstimmen. Liege ich falsch?
Denken Sie daran, dass beim Zusammenführen von Änderungen vom Hintergrund zum Haupt-Thread nur wenige Objekte aktualisiert wurdenisSync
Eigentum.