2011-07-15 26 views
13

Estoy usando un NSFetchedResultsController para tratar con una UITableView y todo funciona bien y lo encontré muy poderoso, especialmente en conjunto con el delegado de resultados. Para profundizar en la tabla reutilizo la misma clase de controlador, que se instancia con los parámetros haciendo clic en una fila de la celda, el controlador luego se empuja al UINavigationController y se genera otra vista de tabla, nuevamente con NSFetchedResultsController.Uso correcto de caché NSFetchedResultsController

En este punto, cada controlador tiene su propio caché, y el nombre de caché se deriva con un identificador único [NSString stringWithFormat "cacheName _% @", uniqueStringForCell], y al final obviamente puedo tener muchos caché.

Ahora las preguntas.

1) Tener muchos caché puede ser un problema?

2) ¿Cuándo se supone que debemos usar un caché?

3) En caso de deleteCacheWithName, ¿cuál es el mejor lugar para poner dicho método? Lo he intentado en ViewWillDisappear, pero con esto supongo que puedo tener un problema cuando la vista aparecerá de nuevo y la caché ya no está presente, por ejemplo cuando se usa con un UINavigationController. Probablemente el método dealloc es el mejor lugar?

4) ¿Cuál es la relación entre un caché y la gestión de memoria? Quiero decir, cuando se envía un mensaje (void) didReceiveMemoryWearning, ¿necesito eliminar el caché? Si es así, ¿qué hay de reconstruirlo de nuevo? ¿Cuál es la forma preferida, tal vez re emitiendo la recuperación?

5) el controlador de búsqueda tiene su delegado configurado en UITableViewController (fetchController.delegate = self), ¿hay algún problema con eso? En cierto sentido, ¿en caso de cambio, se avisa a más de un controlador? ¿Y deleteCacheWithName también elimina el delegado?

gracias

Respuesta

11

Para responder (algunos) a sus preguntas:

1) Tener múltiples cachés no es un problema. De hecho, a partir de la referencia de clase de Apple:

  • Si tiene varios controladores resultados inverosímiles con diferentes configuraciones (diferentes descriptores de clasificación, etc.), debe dar cada una caché de nombres diferentes.

He tenido problemas con aplicaciones anteriores en las que no he hecho esto solo para obtener una excepción que perdí tiempo intentando resolver.

2) Se supone que debemos usar la caché para almacenar cualquier trabajo repetido que NSFetchedResultsController necesite hacer. Cada vez que cambia la sección o la información de pedido, la caché se actualiza. De manera similar, si el caché no es coherente con la información actual en la base de datos (agregaste una nueva fila, eliminaste, etc.), entonces el controlador libera el caché y lo borra.

3) He puesto personalmente deleteCacheWithName en el método viewDidUnload. No estoy seguro si este es el mejor lugar o no.

No estoy seguro acerca de 4. En términos de reconstrucción de la memoria caché, esto debería suceder automáticamente si la memoria caché actual no está sincronizada con la aplicación. No he hecho nada específico para la gestión de memoria y la memoria caché en ninguna de mis aplicaciones.

5) Esto no debería ser un problema. Una vez más, desde la documentación de Apple:

  • Si configura un delegado para un controlador resultados exagerado, el controlador registra para recibir notificaciones de cambio de su contexto logrado objeto. Cualquier cambio en el contexto que afecte al conjunto de resultados o la información de la sección se procesa y los resultados se actualizan en consecuencia. El controlador notifica al delegado cuando los objetos de resultado cambian su ubicación o cuando se modifican las secciones (consulte NSFetchedResultsControllerDelegate). Por lo general, utiliza estos métodos para actualizar la visualización de la vista de tabla.

FYI, aquí está el enlace a los documentos dev manzana para esta clase: http://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html

HTH