Pregunta

Estoy escribiendo una aplicación con dos tablas en una sola pantalla. La tabla de la izquierda es una lista de carpetas y la tabla de la derecha muestra una lista de archivos. Cuando se golpea en una fila de la izquierda, la tabla de la derecha mostrará los archivos que pertenecen a esa carpeta.

Estoy usando datos básicos para el almacenamiento. Cuando la selección de carpeta cambia, el predicado de NSFetchedResultsController de la tabla de la derecha va a cambiar y realizar una nueva zona de alcance traiga, a continuación, volver a cargar los datos de la tabla. He utilizado el siguiente fragmento 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];

Sin embargo, los resultados de la exploración son todavía el mismo . He NSLog'ed "predicado" antes y después de la búsqueda, y fueron correctos con información actualizada. Los extraer resultados permanecen igual que inicial fetch (cuando se carga vista).

No estoy muy familiarizado con la forma en la base de datos va a buscar objetos (¿existe un sistema de almacenamiento en caché?), Pero he hecho cosas similares antes (predicados que cambian, los datos de volver a ir a buscar, y una mesa refrescante) con vistas individuales de mesa y todo fue bien.

Si alguien pudiera me dio una pista que sería muy apreciado.

Gracias de antemano.

¿Fue útil?

Solución

Yo tenía casi exactamente este problema, hasta que encontré la pista en un post muy reciente blog en incubadora iphone

NSFetchedResultsController está el almacenamiento en caché los primeros resultados. (Es probable que tenga algo fijado en initWithFetchRequest: managedObjectContext: sectionNameKeyPath: cacheName)

Estoy adivinando su código (como la mía) es una derivación de la muestra CoreData, por lo que asumiendo que es @ "raíz", antes de cambiar el predicado, hacer un

[NSFetchedResultsController deleteCacheWithName:@"Root"];  

Otros consejos

En respuesta mi caso de deafgreatdane no está funcionando; lo que hice en cambio, es probable que ingenuo, pero funciona:

  • crear predicado correspondiente (s) en el método configureCell:atIndexPath: (llamado en tableView:cellForRowAtIndexPath:)
  • a continuación, llamar a:
    [_fetchedResultsController.fetchRequest setPredicate:predicate];
    [_fetchedResultsController performFetch:nil];
  • referirse al objeto devuelto llamando [self.fetchedResultsController objectAtIndexPath:indexPath]

Esto funcionó para mí:

[NSFetchedResultsController deleteCacheWithName:nil];  
[self.fetchedResultsController.fetchRequest setPredicate:predicate]; 

NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
    NSLog(@"%@, %@", error, [error userInfo]);
    abort();
} 

Tenía un problema similar en mi proyecto rápida. Esto funcionó para mí

NSFetchedResultsController.deleteCache(withName: fetchedResultsController.cacheName)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top