CloudKit: CKFetchRecordChangesOperation, CKServerChangeToken y Delta Descargar

Mi pregunta está relacionada con la function "Delta Download", tal como se mencionó en WWDC 2014 Advanced CloudKit.

Estoy intentando sincronizar mi aplicación Core Data, que es iPhone solo por ahora (piense que solo hay un dispositivo activo). Entonces, básicamente, la aplicación almacenará los loggings de usuarios en la nube desde un mismo dispositivo, en la mayoría de los casos por ahora.

Tengo problemas para comprender la function de zona personalizada que se basa en CKFetchRecordChangesOperation también CKFetchRecordChangesOperation como Delta Download.

Como CKServerChangeToken , tenemos CKServerChangeToken para mantener las operaciones de synchronization (me refiero a download solo aquellos loggings que fue agregado / modificado / borrado por otro dispositivo), tal como se presentó en WWDC. Pero, lo que no puedo entender es que recibimos ese token solo después de CKFetchRecordChangesOperation , cuando guardamos loggings en la nube, no obtenemos un token nuevo.

Y si hacemos search con el token disponible actual (ya que cambia solo después de search), recibimos loggings que se saveon de nuestra operación de salvar anterior. Basicamente, obtenemos save los recoders que ya tenemos en nuestro dispositivo. ¿Por qué? ¿Me estoy perdiendo algo aquí?

¿Qué pasa si sembramos algunos datos en la nube (desde el dispositivo A), está justificado por la situación cuando el dispositivo B está trayendo los loggings de zona, pero qué sucede si el dispositivo A es? ¿Descarga todos los loggings nuevamente?

Encontré recordChangeTag en el CKRecord , esta es una propiedad que puedo usar para resolver conflictos con objects locales: objects buscados (la misma o diferente versión), si es así, alguien me puede dar un ejemplo de cómo debo hacer esto: save recordChangeTag en Core Data ¿Cuándo save el logging en CloudKit por primera vez o cómo?

La falta de documentation es un dolor de cabeza.

Encontré un momento para escribir una respuesta para esta pregunta. No profundizaré en la implementación, pero discutiré el concepto.

CloudKit proporciona una manera de sincronizar los datos entre su dispositivo y el server CloudKit. Lo que utilizo para establecer el process de synchronization en mi caso entre iPhone y server solamente (de nuevo, si tienes una aplicación iPhone + iPad, el process requiere más pasos):

Tengo una zona personalizada en la database de la nube privada. Utilizo OperationQueue para establecer diferentes processs asíncronos que dependen uno del otro. Algunas operaciones tienen queues de operaciones propias.

Pasos:

1) Comprobar si existe mi zona personalizada.

1.1) Si no hay una zona personalizada

1.2) Crear una nueva zona personalizada. (Opcional: agregar loggings)

1.3) Actualizar ficha de cambio de zona

Puede actualizar el token de cambio de zona realizando: CKFetchRecordChangesOperation , fetchRecordChangesCompletionBlock devuelve CKServerChangeToken savelo en UserDefaults (por ejemplo) utilizando NSKeyedArchiver). La tarea de esta operación es actualizar token y se realiza al final del process de synchronization.

2) Si ya hay una zona personalizada

2.1) Obtenga cambios desde la zona utilizando el token de cambio de zona previamente guardado. ( CKFetchRecordChangesOperation )

2.2) Actualiza y elimina loggings locales.

2.3) Actualizar el token de cambio de zona.

2.4) Verifique los cambios locales (estoy usando la última timestamp de synchronization en la nube para verificar qué loggings se modificaron después).

2.5) Cargar loggings en la database del kit de la nube

2.6) Actualice nuevamente el token de cambio de zona.

Recomiendo encarecidamente la serie de artículos de Nick Harris: https://nickharris.wordpress.com/2016/02/09/cloudkit-core-data-nsoperations-introduction/

Encontrará allí conceptos de implementación y layout. Vale la pena leerlo. Espero que alguien encuentre todo esto útil.

Intereting Posts