2010-02-07 19 views
10

Estoy usando Core Data en mi primera aplicación de iPhone e intento entender NSFetchedResultsController. Funciona muy bien en mi vista de raíz. ¿Necesito crear una instancia en cada uno de mis controladores de vista? Si es así, ¿hay una plantilla que haga esto tan fácil como lo fue en mi controlador raíz (acabo de marcar un cuadro en la plantilla al crear el proyecto). Cuando agrego un único controlador de vista nuevo, no veo una opción para usar Core Data.¿Debería tener NSFetchedResultsController en cada vista?

Actualización: Incluso después de cortar/pegar el código en mi segunda vista, me tomó un tiempo darme cuenta de que también necesitaba configurar managedObjectContext antes de cambiar a la nueva vista. He añadido la siguiente línea a mi RootViewController antes de empujar la nueva vista en la pila de navegación:

self.newVC.managedObjectContext = self.managedObjectContext; 

Respuesta

11

Si sus otros puntos de vista están visualizando diferentes entidades, entonces sí, se utiliza una diferente NSFetchedResultsController. Básicamente puede salirse con la copia y pegar el código del controlador de vista raíz autogenerado para sus otros controladores de vista ... simplemente cambie el nombre de la Entidad.

Sin embargo, si las otras vistas de la jerarquía (de la tabla) solo muestran atributos diferentes de la misma entidad, es más eficiente/simple pasar el objeto existente NSFetchedResultsController por la jerarquía. Simplemente cree un miembro NSFetchedResultsController en la interfaz de clase y exhíbalo como una propiedad en el archivo .h del controlador de vista, y luego sintetice la propiedad y suéltela en su archivo .m. Luego configure la propiedad antes de presionar el controlador de vista en la pila.

+0

Gracias. Estoy visualizando una entidad diferente. ¿XCode hace algo para que sea más fácil, o realmente tengo que cortar/pegar ese código para cada vista? Sé que no es gran cosa, pero tengo que tomar las definiciones del encabezado y la implementación desde el archivo m. Un poco doloroso –

+0

Realmente tiene que cortar y pegar para cada vista. O eso, o crea otra clase para abstraer la interacción con el controlador de resultados obtenidos. Sin embargo, lo intenté una vez y hubiera sido mucho mejor tratar directamente con el controlador de resultados obtenido. – kubi

+0

Como dice kubi, abstraer algunos de los detalles aquí puede ser o no eficiente, dependiendo de la cantidad de Entidades diferentes que necesite visualizar. Si es 2 o 3, copie y pegue. Si es 10, tal vez la abstracción comience a ahorrarle tiempo. O tal vez si este código va a ser reutilizado mucho más tarde, eso también sugiere mantenerlo limpio desde el principio. Sea pragmático aquí y realice la llamada según su dominio y sus requisitos, y no una adhesión estricta al principio DRY. –

3

me gustaría añadir que si está utilizando múltiples NSFetchedResultsControllers para la misma entidad, pero en diferentes mesas, su UITableView no actualizar si inserta los datos de la misma entidad que utilice otro controlador. Esto se debe a que su UITableView no recibirá los mensajes willChangeContent, etc. de un NSFetchedResultsController para el cual no se ha establecido como delegado.

+0

Me acabo de morder. No estoy seguro de si realmente vale la pena compartirlos: generalmente es bastante fácil crear uno nuevo y no tener que preocuparse por cosas como esta. –

+0

@Alex stone ¿Podría ayudarme en mi situación actual? – Dinakar

+0

@Alex ¿Podrían por favor ayudarme en mi situación actual? Tengo un TableView en un ViewController y estoy reutilizando el viewContoller para algunos módulos en mi aplicación. Reutilizo el tableView pero fetchController debería ser una nueva instancia. Cuando intenté implementar esta aplicación se bloqueó: "Inconsistencia interna". Como tableView contiene filas pobladas por fetchresultController anterior y debería eliminar las filas y secciones rellenas antes de cargar datos usando una nueva instancia de fetchController (los datos en los datos centrales deberían persistir y solo se debe actualizar tableView). ¿Podría ayudarme en este escenario? – Dinakar

Cuestiones relacionadas