NSFetchedResultsController não mostra atualizações de um contexto diferente

eu tenho umNSFetchedResultsController e algumas operações atualizam objetos gerenciados em encadeamentos separados viaNSOperationQueue.

O FRC (com seu predicado) se parece com isto:

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

O encadeamento principal e a operação encadeada têm seus próprios contextos de objetos gerenciados. Eles compartilham apenas o mesmo coordenador.

Dentro da operação de thread eu mudo oisSync propriedade deNO paraYES. Para saber o que éCheck entidade para atualizar, o contexto principal passa para o threadedNSManagedObjectID. A operação encadeada recupera o objeto gerenciado da seguinte maneira:

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

Quando a operação de thread chama umsave amergeChangesFromContextDidSaveNotification notificação é chamada e o contexto principal mescla as mudanças.

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

Registrando a descrição donotification leva a verificar se as alterações são realizadas corretamente.

Meu problema

Delega métodos deNSFetchedResultsControllerDelegate não são chamados.

Isto é bastante estranho, uma vez que lidar com o mesmo contexto, o principal, permite ouvir as mudanças e os métodos dos delegados são chamados, e. excluir um objeto de linha noUITableView.

Eu encontrei alguns tópicos sobre SO com o mesmo problema. Eu tentei todas as soluções, mas não consigo encontrar uma solução valiosa:

NSFetchedResultsController não mostrando atualizações de outros contextos

NSFetchedResultsController não disparando o método delegado após mesclar atualização do thread de segundo plano

NSFetchedResultsController com predicado ignora as alterações mescladas de NSManagedObjectContext diferente

Agradeço antecipadamente.

Editar

O código acima estava funcionando em um modelo anterior. Então criei um novo modelo copiando (e colando) entidades do anterior e agora ele não funciona mais.

Sugestões?

Editar 2

Este é o predicado que estou usandoNSFetchedResultsController getter. É minha culpa, mas quando eu escrevi o post eu não copiei.

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

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

Agora, sobreJody último comentário

No main () de sua NSOperation, você está carregando novos objetos, e aí parece que você está definindo isSync como YES para cada novo objeto. O predicado que você usa para o fetchedResultsController está procurando apenas por objetos que possuem isSync == NO.

Espero que quando a propriedadeisSync está definido para SIM, oNSFetchedResultsController observa que altera e remove linhas que não correspondem ao predicado. Estou errado?

Lembre-se de que ao mesclar as mudanças do plano de fundo para o thread principal, sou capaz de ver que poucos objetos atualizaram suasisSync propriedade.

questionAnswers(2)

yourAnswerToTheQuestion