¿Forma óptima de sincronizar datos básicos con datos del lado del server?

Tengo lo que supongo que es una situación muy común, pero como soy nuevo en la progtwigción de iOS, no estoy seguro de la forma óptima de codificarlo.

Sinopsis:

Tengo datos en un server que puede ser recuperado por la aplicación iPhone a través de un service REST. En el lado del server, los datos son objects con una key externa (un número de identificación integer).

Estoy almacenando los datos recuperados a través de REST en Core Data. Los objects gestionados tienen un atributo "objId" para que pueda identificar de manera única los objects gestionados en el rest de mi código.

Mi aplicación siempre debe reflejar los datos del server.

En requestes posteriores realizadas al server:

  • algunos objects pueden no ser devueltos, se han eliminado en el server, en cuyo caso necesito eliminar los objects correspondientes de Core Data, de modo que estoy reflejando el estado del server correctamente.

  • algunos objects tienen attributes que han cambiado, por lo tanto, los objects gestionados correspondientes necesitan actualizarse con los nuevos datos.

mi solución y pregunta para ti

Para que las cosas funcionen en mi aplicación, hice la solución más fácil de eliminar todos los objects en Core Data, luego agregué todos los objects nuevos, creados con los últimos datos del lado del server.

No creo que esta sea la mejor manera de abordarlo 🙂 A medida que avanzo con mi aplicación, ahora quiero enlazar mi tableview con NSFetchedResultsController, y me he dado count de que mi enfoque de eliminar todo y volver a agregar no se va para trabajar más.

¿Cuál es la forma probada y confiable de sincronizar datos básicos con datos del lado del server?

¿Necesito hacer una request de búsqueda para cada ID de object que regrese del server y luego actualizar el object con los nuevos datos?

Y luego repasar todos los objects en los datos centrales y ver cuáles no se han actualizado y eliminarlos.

¿Esa es la mejor manera de hacerlo? Simplemente parece un poco caro hacer una búsqueda para cada object en Datos básicos, eso es todo.

El pseudo código está bien para cualquier respuesta 🙂

¡gracias por adelantado!

Bueno, considera tu descarga. Primero, deberías hacer esto en un hilo de background (si no, hay muchas publicaciones SO que hablan sobre cómo hacerlo).

Sugiero que implementes lo que tiene sentido primero, y luego, luego de que puedas get los datos de performance válidos de la ejecución de Instrumentos, considera la optimization del performance. Por supuesto, usa un poco de sentido común en el performance "fácil" (tu layout puede ocuparte de los más grandes con bastante facilidad).

De todos modos, obtenga sus datos del recurso en línea, y luego, para cada object obtenido, use el "ID de object único" para search el object a partir de los datos del núcleo. Usted sabe que solo hay un object con esa identificación, por lo que puede establecer fetchLimit en 1 en su request de búsqueda. También puede configurar su atributo "object id" para que sea un ÍNDICE en la database. De esta manera, obtiene la búsqueda más rápida de la database subyacente, y sabe dejar de search una vez que encuentra su único object. Esto debería ser bastante rápido.

Ahora tienes tu object. Cambia cualquier atributo necesario. Guarde, enjuague y repita.

Además, por varias razones, es posible que desee saber cuándo se actualizaron los objects por última vez. Sugiero agregar una timestamp a cada object que se cambia con la hora actual cada vez que se cambia un object. Esto también ayudará a eliminar objects. Como su database en línea no le indica qué objects se eliminan, debe tener alguna forma de saber que un elemento es "antiguo y ya no es necesario".

Una manera fácil de hacerlo es recordar la hora en que comenzó su actualización. Después de procesar todos los objects de la descarga, ahora tiene una manera de encontrar todos los objects que fueron eliminados de la database en línea. Básicamente, cualquier object con una timestamp de "última actualización" antes de la hora en que comenzó la actualización debería eliminarse (ya que no se agregaron ni modificaron en la última actualización). También puede indexar la database en este campo, lo que hará que encontrar esos objects sea más rápido, a less que su database sea enorme, espero ver qué dice Instruments sobre este.