NSFetchedResultsController nie pokazuje aktualizacji z innego kontekstu

mamNSFetchedResultsController i kilka operacji aktualizuje zarządzane obiekty w osobnych wątkach za pośrednictwemNSOperationQueue.

FRC (z jego predykatem) wygląda tak:

<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>

Główny wątek i operacja wątkowa mają własne konteksty obiektów zarządzanych. Dzielą się tylko tym samym koordynatorem.

W operacji wątkowej zmieniamisSync własność zNO doYES. Aby wiedzieć, co jestCheck obiekt do aktualizacji, główny kontekst przechodzi do wątku aNSManagedObjectID. Operacja wątkowa pobiera zarządzany obiekt w następujący sposób:

<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>

Gdy operacja wątku wywołuje asave mergeChangesFromContextDidSaveNotification powiadomienie jest wywoływane, a główny kontekst łączy zmiany.

<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>

Rejestrowanie opisunotification prowadzi do sprawdzenia, czy zmiany są wykonywane poprawnie.

Mój problem

Metody delegowaniaNSFetchedResultsControllerDelegate nie są wywoływane.

Jest to dość dziwne, ponieważ zajmowanie się tym samym kontekstem, głównym, pozwala na nasłuchiwanie zmian i wywoływanie metod delegatów, np. usunięcie obiektu wiersza wUITableView.

Znalazłem kilka tematów dotyczących SO z tym samym problemem. Próbowałem wszystkich obejść, ale nie mogę znaleźć wartościowego rozwiązania:

NSFetchedResultsController nie pokazuje aktualizacji z innych kontekstów

NSFetchedResultsController nie uruchamia metody delegowania po scaleniu aktualizacji z wątku w tle

NSFetchedResultsController z predykatem ignoruje zmiany scalone z różnych NSManagedObjectContext

Z góry dziękuję.

Edytować

Powyższy kod działał w poprzednim modelu. Następnie stworzyłem nowy model kopiujący (i wklejający) elementy z poprzedniego, a teraz już nie działa.

Propozycje?

Edytuj 2

To jest predykat, w którym używamNSFetchedResultsController rębacz. To moja wina, ale kiedy napisałem post, nie skopiowałem go.

<code>NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"insertionDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

// previous code here
[fetchRequest setSortDescriptors:sortDescriptors];
</code>

Teraz oJody ostatni komentarz

W main () twojej NSOperation ładujesz nowe obiekty, a tam wygląda na to, że ustawisz isSync na YES dla każdego nowego obiektu. Predykat, którego używasz dla fetchedResultsController, szuka tylko obiektów, które mają isSync == NO.

Spodziewam się tego, gdy nieruchomośćisSync jest ustawiony na TAK,NSFetchedResultsController zauważa, że ​​zmienia i usuwa wiersze, które nie pasują do predykatu. Czy się mylę?

Pamiętaj, że podczas scalania zmian z tła do głównego wątku, widzę, że kilka obiektów zaktualizowało ichisSync własność.

questionAnswers(2)

yourAnswerToTheQuestion