cómo actualizar fetchedResultsController después de un cambio persistente en la tienda

Soy un guerrero de fin de semana cuando se trata de progtwigción, así que probablemente haya hecho algo mal …

Tengo un controller de vista dividida, datos centrales, nsfetchedResultsController, todo funciona bien. Ahora tengo una opción para que el usuario cree un file de copy de security del file persistentStore.sqlite. Cuando el usuario restaura un file de copy de security, la vista de tabla no refleja ningún cambio. Y encima de eso, no puede hacer ningún cambio duradero a partir de entonces desde el tableview add / delete. Cuando salgo de la aplicación y la reinicio, todos los datos están allí desde la copy de security y todo funciona bien.

¿Cómo puedo forzar la vista de tabla para get la nueva información del controller de resultados obtenido? ¿O cómo forzo la

Aquí hay algunas dispersiones de lo que he intentado hasta ahora sin éxito:

MasterViewController.m - (void)viewDidLoad { context = [[OSCDStackManager shanetworkingManager] managedObjectContext]; } [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadFetchedResults) name:OSFilesUpdatedNotification object:nil]; - (void)reloadFetchedResults:(NSNotification*)note { NSError *error = nil; if (![[self fetchedResultsController] performFetch:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } if (note) { [self.tableView reloadData]; } } - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { NSError *error = nil; [self.fetchedResultsController performFetch:&error]; [self.tableView endUpdates]; [self.tableView reloadData]; } 

desde un menu desplegable de actualización manual en el tableview …

 -(void) updateTable{ context = [[OSCDStackManager shanetworkingManager] managedObjectContext]; NSError *error = nil; [self.fetchedResultsController performFetch:&error]; //[self.tableView endUpdates]; [self.tableView reloadData]; [self.refreshControl endRefreshing]; } - (void)viewWillAppear:(BOOL)animated { [self.tableView reloadData]; } - (NSFetchedResultsController *)fetchedResultsController { context = [[OSCDStackManager shanetworkingManager] managedObjectContext]; if (_fetchedResultsController != nil) { return _fetchedResultsController; } NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:context]; [fetchRequest setEntity:entity]; [fetchRequest setFetchBatchSize:20]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; NSArray *sortDescriptors = @[sortDescriptor]; [fetchRequest setSortDescriptors:sortDescriptors]; NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; //[NSFetchedResultsController deleteCacheWithName:@"cache"]; aFetchedResultsController.delegate = self; self.fetchedResultsController = aFetchedResultsController; NSError *error = nil; if (![self.fetchedResultsController performFetch:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return _fetchedResultsController; } 

A pesar de que esta es una aplicación para mi vecino, no me gustaría decirle que mata y reinicia la aplicación después de una copy de security …

La solución terminó siendo una combinación de ambas respuestas a continuación,

 - (void)reloadFetchedResults{ self.fetchedResultsController = nil; [NSFetchedResultsController deleteCacheWithName:@"cache"]; NSError *error = nil; if (![self.fetchedResultsController performFetch:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } [self.tableView reloadData]; } 

sin tu FRC

 -(void)reloadData { NSError *error = nil; self.fetchedResultsController = nil; if (![self.fetchedResultsController performFetch:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); } else [self.tableView reloadData]; } 

** EDIT ** en caso de que no sea obvio con el 'self' en el frente, necesitará en algún lugar de su class

 -(NSFetchedResultsController *)fetchedResultsController { if (!_fetchedResultsController) { _fetchedResultsController = [NSFetchedResultsController alloc]initWithFetchRequest:aFetchRequest managedObjectContext:aManagedObjectContext // the main thread MOC sectionNameKeyPath:nil cacheName:nil]; // addional FRC setup etc. } return _fetchedResultsController; } 

¿Eliminaste el caching?

Primero debe establecer el nombre del caching en el fetchedResultsController (observe el argumento cacheName al final):

 _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:query managedObjectContext:context sectionNameKeyPath:nil cacheName:@"CACHE_NAME"]; 

Luego borre el caching cuando realice una actualización:

 [NSFetchedResultsController deleteCacheWithName:@"CACHE_NAME"]; 

Después de hacer esto, vuelva a cargar los datos del núcleo haciendo esto:

 NSError *error; if (![self.fetchedResultsController performFetch:&error]) { // Update to handle the error appropriately. NSLog(@"Unresolved error loading data %@, %@", error, [error userInfo]); exit(-1); // Fail } [self.tableView reloadData]; 

Si está reemplazando el file sqlite, probablemente lo mejor sea desmontarlo todo y comenzar con un nuevo context de object gestionado. Esta es una pregunta similar para eliminar la tienda.