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

NSFetchedResultsController löst nach dem Zusammenführen des Updates vom Hintergrundthread keine Delegatmethode aus

NSFetchedResultsController mit Prädikat ignoriert Änderungen, die aus verschiedenen NSManagedObjectContext-Objekten zusammengeführt wurden

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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage