Escribo una pequeña aplicación de iPhone para mi empresa que muestra reservas para cada empleado una semana a la vez. Estoy usando datos básicos para obtener una lista de 'Reservas' para una semana determinada y quiero mostrarlas en una UITableView desglosada en una sección por día de la semana.Agregar secciones adicionales a NSFetchedResultsController
El problema es que necesito mostrar 7 secciones para cada día de la semana (mostrando una celda 'No reservas' donde una sección/fecha no tiene reservas).
Tengo una captura de pantalla de la aplicación tal y como está here (lo siento no puede publicar las imágenes sin embargo, como soy nuevo en StackOverlow)
En este momento estoy lograr esto mediante el uso de un 'fetchResults "método que consiga los reservas y los organiza para una gran variedad de posibles fechas:
- (void)refetchResults {
// Drop bookings Array, replacing with new empty one
// 7 slots for 7 days each holding mutable array to recieve bookings where appropraite
self.bookings = [NSArray arrayWithObjects:[NSMutableArray array],
[NSMutableArray array], [NSMutableArray array],
[NSMutableArray array], [NSMutableArray array],
[NSMutableArray array], [NSMutableArray array], nil];
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Booking" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Limit to this weeks data
[fetchRequest setPredicate:
[NSPredicate predicateWithFormat:@"(date >= %@) && (date <= %@) && (resource == %@)",
firstDate,lastDate,resourceId]];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"recId" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
// Fetch records in to array
NSError *error;
NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (results == nil) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[fetchRequest release];
[sortDescriptor release];
[sortDescriptor2 release];
[sortDescriptors release];
// Walk through records and place in bookings Array as required
for (Booking *item in results) {
// Decide on array index by difference in firstDate and booking date
int idx = (int)[[item date] timeIntervalSinceDate:firstDate]/86400;
// Add the item to the approp MutArray
[(NSMutableArray *)[bookings objectAtIndex:idx] addObject:item];
}
// Reload table
[tableView reloadData];
}
Mi pregunta es: ¿hay alguna manera de conseguir el mismo resultado utilizando NSFetchedResultsController? De alguna manera, necesitaría tener el NSFetchedResultsController para tener 7 secciones, una para cada día de la semana, algunas de ellas posiblemente sin reservas.
Cualquier ayuda muy apreciada :)
Gracias por la respuesta. A menos que me falta algo, todavía necesitaría hacer un ejercicio de mapeo para encontrar la sección apropiada, es decir: TableView solicitaría la sección 0 a 6 (que representa, por ejemplo, del 1 de noviembre al 7 de noviembre) pero NSFetchedResultsController solo podría tener secciones 0, 1 y 2 (que representan, tal vez, reservas para el 2 de noviembre, el 3 de noviembre y el 6 de noviembre). Podría hacer este mapeo cada vez que necesite referirme a las Reservas o podría guardar en caché la asignación cuando construya NSFetchedResultsController, pero espero que haya una manera mejor/más ordenada de hacerlo. – Paul80nd
Tienes razón. Lamento no ser de más ayuda. Voy a experimentar con esto más tarde, a mí mismo, según lo permita el tiempo. Es curioso saber si/cómo resuelves esto. – westsider
En realidad, pensando un poco más sobre esto, creo que una solución utilizable por el momento es crear un NSFetchedResultsController como de costumbre pero luego, al final de ese conjunto, los campos de una matriz 'mapeo' para traducir las secciones de la tabla vista a las secciones del NSFetchedResultsController. Esto debería significar que puedo obtener las notificaciones de objeto desde el control de resultados (lo cual es bueno;) - Solo necesitaré actualizar la matriz de "mapeo" cuando lleguen las notificaciones para elementos agregados/eliminados del controlador de resultados. De cualquier manera, si encuentro una solución más agradable, me aseguraré de publicarla aquí. – Paul80nd