NsfetchedResultScontroller: Mudança de predicado não está funcionando?
-
21-09-2019 - |
Pergunta
Estou escrevendo um aplicativo com duas tabelas em uma tela. A tabela esquerda é uma lista de pastas e a tabela certa mostra uma lista de arquivos. Quando tocado em uma linha à esquerda, a tabela direita exibirá os arquivos pertencentes a essa pasta.
Estou usando dados principais para armazenamento. Quando a seleção das pastas muda, o predicado busca do NSFetchedResultScontroller da tabela direita mudará e executará uma nova busca e recarregue os dados da tabela. Eu usei o seguinte snippet de código:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list = %@",self.list];
[fetchedResultsController.fetchRequest setPredicate:predicate];
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[table reloadData];
No entanto, os resultados da busca ainda são os mesmos. Eu já tive o "predicado" antes e depois da busca, e eles estavam corretos com informações atualizadas. Os resultados da busca permanecem iguais à busca inicial (quando a visualização é carregada).
Não estou muito familiarizado com a maneira como os dados principais buscam objetos (existe um sistema de armazenamento em cache?), Mas já fiz coisas semelhantes antes (mudando de predicados, re-buscando dados e tabela refrescante) com vistas de mesa únicas e tudo foi Nós vamos.
Se alguém pudesse me dar uma dica, eu seria muito apreciado.
Desde já, obrigado.
Solução
Eu tive quase exatamente esse problema, até encontrar a dica em uma postagem de blog muito recente em Incubadora para iPhone
O NSFetchedResultScontroller está em cache os primeiros resultados. (Você provavelmente tem algo definido no initWithFetchRequest: ManagedObjectContext: SectionNameKeypath: Cachename)
Acho que seu código (como o meu) é uma derivação da amostra de Coredata, portanto, assumindo que é @"root", antes de alterar o predicado, faça um
[NSFetchedResultsController deleteCacheWithName:@"Root"];
Outras dicas
No meu caso, a resposta de Surafgreatdane não está funcionando; O que eu fiz, em vez disso, é provavelmente ingênuo, mas funciona:
- criar predicado (s) correspondente no (s)
configureCell:atIndexPath:
método (chamado emtableView:cellForRowAtIndexPath:
) - então ligue:
[_fetchedResultsController.fetchRequest setPredicate:predicate];
[_fetchedResultsController performFetch:nil];
- Consulte o objeto devolvido ligando
[self.fetchedResultsController objectAtIndexPath:indexPath]
Isso funcionou para mim:
[NSFetchedResultsController deleteCacheWithName:nil];
[self.fetchedResultsController.fetchRequest setPredicate:predicate];
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"%@, %@", error, [error userInfo]);
abort();
}
Teve um problema semelhante no meu projeto SWIFT. Isso funcionou para mim
NSFetchedResultsController.deleteCache(withName: fetchedResultsController.cacheName)