2010-05-11 16 views
5

Estoy tratando de conocer Core Data (soy un novato en el desarrollo de iPhone) y para ello estoy tratando de obtener un objeto del control de resultados fetched y NSlog su nombre (una propiedad del objeto) . Traté de hacerlo de esta manera:Core Data fetchedresultscontroller pregunta: ¿para qué sirven las "secciones"?

NSArray *ar = [NSArray arrayWithArray:[fetchedResultsController sections]]; 
Task *t = [ar objectAtIndex:0]; 
NSLog(@"%@", t.taskName); 

Sin embargo, la aplicación se estrelló con este error: la aplicación se bloquea con el error

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[_NSDefaultSectionInfo taskName]: unrecognized selector sent to instance 0x3d1f670'

desde entonces he aprendido que es necesario utilizar objetos de la descabellada propiedad para esto, pero ¿para qué sirven las secciones? Gracias por cualquier ayuda, lo siento si esta es una pregunta supremamente estúpida. Revisé la documentación pero todavía no entiendo.

Respuesta

27

NSFetchedResultsController puede agrupar sus objetos en secciones según la clave que especifique. Entonces, por ejemplo, si su entidad tiene una propiedad category, puede agrupar sus objetos por category y mostrarlos bajo un encabezado para esa categoría.

Cada UITableView (y cada NSFetchedResultsController) contiene al menos una sección, por lo que incluso si no está utilizando esta funcionalidad, igual tendrá que ocuparse de las secciones. Si check the documentation, verá que los objetos en la propiedad sections cumplen con el protocolo NSFetchedResultsSectionInfo, que tiene la propiedad objects que contiene los objetos en esa sección.

Hay dos maneras de obtener un objeto real fuera de un NSFetchedResultsController:

id <NSFetchedResultsSectionInfo> sectionInfo = [fetchedResultsController.sections objectAtIndex:0]; 
Task *task = [sectionInfo.objects objectAtIndex:0]; 

La forma en otra, mucho más simple, y se prefiere utilizar el método objectAtIndexPath:.

Task *task = [fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 

Estas dos muestras son equivalentes. UIKit adds some methods to NSIndexPath para facilitar el trabajo con vistas de tabla y controladores de resultados obtenidos. Además, observe que los métodos UITableViewDataSource y UITableViewDelegate le proporcionan todos los objetos NSIndexPath, por lo que generalmente puede pasarlos a objectAtIndexPath: para obtener el objeto correcto para esa celda.

Apple también proporciona un decent tutorial sobre el uso de Core Data en iPhone. Responderá a muchas de tus preguntas. Lamentablemente, no cubre NSFetchedResultsController en profundidad.

+1

Wow, muchas gracias, esta es una gran información. – Jake