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