2012-01-05 17 views
8

? Estoy escribiendo un método API que devuelve una lista de objetos de un servicio web. Este servicio también almacena resultados en caché e intenta devolver los resultados almacenados en caché (si corresponde) antes de volver a acceder al servicio web. Así que estoy almacenando esta lista en una entidad Core Data. Pero Core Data solo permite que las relaciones to-may se almacenen en un NSSet, lo que no preserva el orden. Pero quiero que los resultados almacenados en caché conserven el orden original (que originalmente era del servicio web). No necesariamente sé cómo se establece ese orden (por lo que no puedo ordenar).¿Cómo puedo conservar una lista ordenada en Core Data

Entonces, ¿cómo puedo conservar esta orden? Mi plan es almacenar una cadena con los identificadores de los objetos que he posterior pueden utilizar para ordenarlos:

NSString *objectIds = @"1 5 2 9 4"; 

Es esta la mejor manera de hacerlo?

Respuesta

10

Si puede apuntar a iOS 5, puede usar la nueva característica NSOrderedSet para las relaciones de datos centrales ordenadas arbitrariamente. Consulte Core Data Release Notes for iOS 5 para obtener más información acerca de esta nueva función.

Si tiene que admitir iOS 4, deberá gestionar el pedido usted mismo. Una forma común de hacerlo es agregar una propiedad entera a su modelo, que luego deberá administrar usted mismo. Luego puede ordenar esta propiedad cuando busque sus datos.

Guardar el orden en una secuencia completamente diferente parece ser la forma incorrecta de hacerlo. Si el orden es importante, esta información debe estar en el modelo y el usuario debe poder consultarla directamente ("dame los primeros cinco objetos de esta lista en particular" o "cuál es el índice del objeto foo"). Tener que obtener una cadena de identificaciones de objeto, analizarlo y luego consultar para ciertas ID de objeto me parece muy incorrecto.

+1

En realidad, creo que eso solo es útil para muchas relaciones. – 3lvis

+0

@SebastianCelis esta es una gran respuesta, fue muy útil para alguien como yo que está aprendiendo iOS Dev por primera vez :) Gracias. – GangstaGraham

+0

Como otro comentarista dijo que NSOrderedSet solo está disponible para muchas relaciones. Además, las notas de la versión para iOS 5 ya no están disponibles. – Ixx

1

Esa es una pregunta subjetiva. También puede configurarlos como una lista vinculada en el orden en que los desee.

1

Incluya un campo de id. De NSNumber en el modelo CoreData en el que está almacenando los objetos. La identificación representará el orden que desea conservar; tendrás que configurarlo tú mismo, obviamente. Luego, cuando recuperes los objetos de CoreData, puedes hacerlo ordenado por esa identificación. Es posible que desee/tenga que mantener en algún lugar el valor de identificación más alto que haya asignado para conservar el pedido correctamente con las siguientes llamadas al servicio web y el inicio de la aplicación.

+0

Eso funcionaría, pero parece más sobrecarga que una simple cadena, aunque no estoy seguro de qué tan bien Core Data trata con cadenas algo grandes. – caleb

+0

Si bien la ID del objeto es un valor que creo que puede confiar en no cambiar a sus espaldas, usar su propio campo de id. Cuyo valor se establece a partir de un índice maestro monótonamente creciente que mantiene en otro lugar seguramente será más limpio, creo. Sin embargo, tengo totalmente la idea de equilibrar la complejidad con la comodidad. Si ya está copiando los miembros de datos de cada objeto (desde el servicio web) a los miembros de datos de los objetos CoreData correspondientes, agregar un campo más para un ID no va a ser mucho más código. –

+0

Core Data no maneja 'NSOrderedSet' cuando se usa en combinación con mogenerator, por lo que esta opción, aunque es más costosa de hacer (probar y aprender), funcionará mejor. – fatuhoku

Cuestiones relacionadas