He estado trabajando en un método para sincronizar los datos centrales almacenados en una aplicación de iPhone entre múltiples dispositivos, como un iPad o una Mac. No hay muchos marcos de sincronización (si es que los hay) para usar con Core Data en iOS. Sin embargo, he estado pensando en el siguiente concepto:
- Se realiza un cambio en el almacén de datos central local y se guarda el cambio. (a) Si el dispositivo está en línea, intenta enviar el conjunto de cambios al servidor, incluida la ID del dispositivo que envió el conjunto de cambios. (b) Si el conjunto de cambios no llega al servidor, o si el dispositivo no está en línea, la aplicación agregará el conjunto de cambios a una cola para enviarlo cuando esté en línea.
- El servidor, sentado en la nube, combina los conjuntos de cambios específicos que recibe con su base de datos maestra.
- Después de fusionar un conjunto de cambios (o una cola de conjuntos de cambios) en el servidor de la nube, el servidor empuja todos esos conjuntos de cambios a los otros dispositivos registrados en el servidor utilizando algún tipo de sistema de sondeo. (Pensé en usar los servicios Push de Apple, pero aparentemente según los comentarios, este no es un sistema viable).
¿Hay algo elegante en lo que deba pensar? He examinado los marcos REST como ObjectiveResource , Core Resource y RestfulCoreData . Por supuesto, todos estos están trabajando con Ruby on Rails, a lo que no estoy vinculado, pero es un lugar para comenzar. Los principales requisitos que tengo para mi solución son:
- Cualquier cambio debe enviarse en segundo plano sin pausar el hilo principal.
- Debe usar el menor ancho de banda posible.
He pensado en varios de los desafíos:
- Asegurarse de que las ID de objeto para los diferentes almacenes de datos en diferentes dispositivos estén conectadas en el servidor. Es decir, tendré una tabla de ID de objeto e ID de dispositivo, que están vinculadas mediante una referencia al objeto almacenado en la base de datos. Tendré un registro (DatabaseId [exclusivo de esta tabla], ObjectId [exclusivo del elemento en toda la base de datos], Datafield1, Datafield2), el campo ObjectId hará referencia a otra tabla, AllObjects: (ObjectId, DeviceId, DeviceObjectId). Luego, cuando el dispositivo empuja hacia arriba un conjunto de cambios, pasará la Id. Del dispositivo y la Id. Del objeto desde el objeto de datos central en el almacén de datos local. Luego, mi servidor en la nube verificará el Id. Del objeto y el Id. Del dispositivo en la tabla AllObjects, y encontrará el registro para cambiar en la tabla inicial.
- Todos los cambios deben tener una marca de tiempo, para que puedan fusionarse.
- El dispositivo tendrá que sondear el servidor, sin usar demasiada batería.
- Los dispositivos locales también deberán actualizar todo lo que esté guardado en la memoria si / cuando se reciben cambios del servidor.
¿Hay algo más que me falta aquí? ¿Qué tipo de marcos debo mirar para hacer esto posible?