2011-01-20 13 views
8

Estoy usando NSFetchedResultsController para implementar KVO para mi UITableView (lo cual es obvio). Lo que no puedo entender es cómo usar múltiples Entidades, una especie de estructura de árbol, para estar presente (ed) simultáneamente.NSFetchedResultsController - KVO, UITableView y un "Árbol"

Aquí está mi configuración:

  • Entity1
    • DisplayName
    • RelationToEntity2
  • Entity2
    • DisplayName

Ahora puedo buscar los datos de cualquiera para ser presentados, hasta ahora todo bien. Lo que quiero es tener un TableView uno seccionada-(como una vista aplanada) con la siguiente estructura:

  • Entity1 (Entrada 1)
  • Entity2 (Entrada 1)
  • Entity2 (Entrada 2)
  • ...
  • Entity1 (Entrada 2):
  • ...

Aunque podría parecer una cosa a hacerse a través de secciones, no lo es. Ambas entidades deben ser UITableViewCells. ¿Puede alguien señalarme la dirección correcta para aplanar la línea sin perder la jerarquía real?

+0

No creo que pueda hacerlo directamente con NSFetchedResultsController; Tendrás que crear un modelo intermedio, cuyas características dependerán de cuántos elementos tengas en tu eventual vista de tabla. Tampoco está claro en tu ejemplo cómo pasas de la estructura de tu árbol a la vista aplanada. ¿Podrías por favor proporcionar algo más completo? – hatfinch

+0

El problema real es cómo obtengo la estructura aplanada del árbol. Mi tabla no sabe cuántos elementos habrá, todo esto lo hace NSFetchedResultsController. Podría crear un modelo intermedio, pero eso es lo que realmente no quiero hacer. – gamma

Respuesta

1

Parece que necesita mantener su propia fuente de datos "aplanada". Tal vez el siguiente trabajo:

Cuando NSFetchedResultController te dice un nuevo Entity1 se ha insertado, se inserta Entity1 y sus asociados Entity2 s en decir, _flattenedArray por lo que se parece a esto:

[<Entity1>, <related Entity2>, <related Entity2>...]

Donde insertarlos depende de usted - se trata básicamente de:

  1. construir un subarreglo que contenga el nuevo Entity1 y Entity2 objetos asociados
  2. decide dónde en _flattenedArray para insertar el nuevo subcampo.
  3. llamada reloadData o algún otro medio para informar a la tableView de los nuevos datos

Cuando se elimina un objeto Entity1, lo quitan y todas las posteriores Entity2 objetos hasta que se encuentra con el final de _flattenedArray o chocar con otro objeto Entity1 . Esto supone que Entity2 nunca es un objeto de "nivel superior". Si es así, solo deberá eliminar esos objetos Entity2 en la relación.

Cuando un objeto Entity1 ganancias o pierde un objeto Entity2, primero se puede eliminar el objeto de Entity1_flattenedArray de colocar nuevamente. Si esto es demasiado eficiente, realice una fusión en su lugar.

+0

Esto suena razonable y es una de las cosas en las que pensé. ¿Qué pasa con la huella de memoria? Siempre tendré datos dobles en mi memoria, ¿verdad? Sin embargo, una solución a esto podría ser obtener solo el casco desnudo de Entidades. – gamma

+0

No lo hará: el NSArray almacena referencias a objetos, no a copias de objetos. Si provienen de CoreData, son NSManagedObjects, lo que significa que es posible que ni siquiera estén en la memoria hasta que acceda a sus atributos o a alguna otra operación que los falle en la memoria. – freespace

+0

Lo hice de esa manera y parece funcionar bien. Es obvio que en algún momento tendré que ocuparme de volver a llenar la lista simple cuando KVO actualice los datos, y eso aún no está perfectamente hecho. – gamma

0

Esta es exactamente la situación para usar la herencia de entidades. Cuando se busca una entidad abstracta padre con un controlador de resultados obtenidos, la tabla puede mostrar todas las entidades secundarias. Use una propiedad de orden de sección para mostrar las secciones en el orden que prefiera. Y use una segunda propiedad de clasificación para ordenar dentro de las secciones. La aplicación Notas hace esto obteniendo una entidad Contenedor abstracta y muestra Cuentas y Carpetas que son entidades secundarias. Separa por Cuenta y la primera carpeta "Toda la celda de iCloud" es en realidad una Cuenta. Las carpetas tienen una relación con una cuenta a pesar de que son iguales en el árbol de herencia de la entidad.

Cuestiones relacionadas