En lugar de usar NSFetchedResultsController como fuente de datos de la vista de tabla, cree un NSArray que configure cuando el usuario cambie el orden con su control segmentado basándose en los contenidos de la matriz en los resultados obtenidos. Luego solo ordena usando la ordenación de matriz estándar. Algo como esto:
- (IBAction)segmentChanged:(id)sender
{
// Determine which segment is selected and then set this
// variable accordingly
BOOL ascending = ([sender selectedSegmentIndex] == 0);
NSArray *allObjects = [fetchedResultsController fetchedObjects];
NSSortDescriptor *sortNameDescriptor =
[[[NSSortDescriptor alloc] initWithKey:@"name"
ascending:ascending] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc]
initWithObjects:sortNameDescriptor, nil] autorelease];
// items is a synthesized ivar that we use as the table view
// data source.
[self setItems:[allObjects sortedArrayUsingDescriptors:sortDescriptors]];
// Tell the tableview to reload.
[itemsTableView reloadData];
}
Así que el descriptor de clase que he utilizado se llama "nombre", pero que iba a cambiar esto con el nombre del campo que desea ordenar en los resultados inverosímiles. Además, los elementos a los que he hecho referencia serían su nueva fuente de datos de la vista de tabla. Sus delegados vista tabla ahora sería algo como esto:
- (NSInteger)tableView:(UITableView*)tableView
numberOfRowsInSection:(NSInteger)section
{
return [items count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Get your table cell by reuse identifier as usual and then grab one of
// your records based on the index path
// ...
MyManagedObject *object = [items objectAtIndex:[indexPath row]];
// Set your cell label text or whatever you want
// with one of the managed object's fields.
// ...
return cell;
}
No estoy seguro si esta es la mejor manera, pero debería funcionar.
Utilicé su solución. Parece que no tiene retraso. Pero, ¿algún cuerpo sabe si esto hará una búsqueda física de la base de datos? – user523234
Tenga en cuenta que cambiar sortDescriptors en FreachRequest instanciada de FRC tiene una desventaja. Al usar el método de delegado 'controller: didChangeObject: atIndexPath: forChangeType: newIndexPath:' FRC informa el objeto como 'movido' en vez de 'actualizado' cuando, como dice el documento, 'el atributo cambiado en el objeto es uno de los descriptores de clasificación utilizados en el buscar solicitud'. FRC toma nota de esas rutas de acceso clave solo en su creación de instancias, por lo tanto, cuando más tarde cambie sortDescriptors a otras rutas de acceso de clave, FRC no lo tendrá en cuenta e informará de 'actualizaciones' en lugar de 'movimientos' o viceversa. Mejor hacer un nuevo FRC. – bteapot