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.

Foi útil?

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 em tableView: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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top