Xcode: TableView no muestra cambios en el modelo

Meleagant

Estoy haciendo una aplicación que tiene una vista de tipo TableView.

El modelo de la aplicación se gestiona mediante Core Data, con un NSFetchedResultsController, de manera que consulta todas las entidades de tipo "Contacto" que he creado.

-(NSFetchedResultsController*) frController{
    
if(_frController == nil){ NSFetchRequest *request = [[NSFetchRequest alloc]init]; NSEntityDescription *entidad = [NSEntityDescription entityForName:@"Contacto" inManagedObjectContext:self.contexto]; request.entity = entidad; request.fetchBatchSize = 10; // Ordenar alfabéticamente NSSortDescriptor *ordenPorNombre = [[NSSortDescriptor alloc] initWithKey:@"nombre" ascending:YES]; NSArray *descriptores = [[NSArray alloc] initWithObjects:ordenPorNombre, nil]; [request setSortDescriptors:descriptores]; // Crear el FetchedResultsController [NSFetchedResultsController deleteCacheWithName:@"Listado"]; _frController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.contexto sectionNameKeyPath:nil cacheName:nil]; _frController.delegate = self; NSError *error = nil; if(![self.frController performFetch:&error]){ NSLog(@"Ha ocurrido un error: %@ %@",error,[error userInfo]); abort(); } } return _frController; }

El controlador de la vista "ListaViewController" está dado de alta en el centro de notificaciones para recibir los avisos cada vez que se modifica el modelo:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(modeloActualizado:) name:NSManagedObjectContextObjectsDidChangeNotification object:self.contexto];

Llamando a la siguiente función:

-(void)modeloActualizado:(NSNotification *)notification{
    [self.searchDisplayController.searchResultsTableView reloadData];
    [self.tableView reloadData];
}

Por algún motivo, cuando creo una nueva entidad "Contacto" en el modelo, la tabla de la vista sigue sin mostrarlo. Si hago una búsqueda con el SearchBar, sí que aparece. Si paro el simulador y vuelvo a iniciarlo, aparecen las nuevas entiedades en la lista.

¿Me estoy dejando algo? ¿No debería ser suficiente con llamar al método reloadData de la tabla cada vez que el modelo cambia?

Muchas gracias :)

EDIT:

He observado que si añado la siguiente línea al método modeloActualizado, funciona correctamente:

_frController = nil;

De esta forma obligo a crear un nuevo NSFetchedResultsController cada vez, pero dudo mucho que sea la forma correcta de hacerlo.

Meleagant

Bueno ya lo he solucionado.

Por si a alguien le sirve, los cambios se gestionan con los métodos de delegado de NSFetchedResultsController, no mediante notificaciones.

3

Usuarios habituales

  • Meleagant