Estou trabalhando em um método para sincronizar os dados principais armazenados em um aplicativo do iPhone entre vários dispositivos, como um iPad ou um Mac. Não há muitas estruturas de sincronização (se houver alguma) para uso com o Core Data no iOS. No entanto, tenho pensado no seguinte conceito:
- Uma alteração é feita no armazenamento de dados do núcleo local e a alteração é salva. (a) Se o dispositivo estiver online, ele tenta enviar o conjunto de alterações para o servidor, incluindo o ID do dispositivo que enviou o conjunto de alterações. (b) Se o conjunto de alterações não chegar ao servidor ou se o dispositivo não estiver online, o aplicativo adicionará o conjunto de alterações a uma fila para enviar quando ficar online.
- O servidor, sentado na nuvem, mescla os conjuntos de alterações específicos que recebe com seu banco de dados mestre.
- Depois que um conjunto de alterações (ou uma fila de conjuntos de alterações) é mesclado no servidor em nuvem, o servidor envia todos esses conjuntos de alterações para os outros dispositivos registrados no servidor usando algum tipo de sistema de pesquisa. (Pensei em usar os serviços Push da Apple, mas aparentemente de acordo com os comentários, este não é um sistema viável.)
Existe algo extravagante em que eu preciso estar pensando? Examinei estruturas REST como ObjectiveResource , Core Resource e RestfulCoreData . Claro, todos eles estão trabalhando com o Ruby on Rails, ao qual não estou vinculado, mas é um ponto de partida. Os principais requisitos que tenho para minha solução são:
- Quaisquer alterações devem ser enviadas em segundo plano sem pausar o thread principal.
- Deve usar a menor largura de banda possível.
Eu pensei em vários dos desafios:
- Certifique-se de que os IDs do objeto para os diferentes armazenamentos de dados em diferentes dispositivos estejam conectados ao servidor. Ou seja, terei uma tabela de IDs de objeto e IDs de dispositivo, que são vinculados por meio de uma referência ao objeto armazenado no banco de dados. Terei um registro (DatabaseId [exclusivo para esta tabela], ObjectId [exclusivo para o item no banco de dados inteiro], Datafield1, Datafield2), o campo ObjectId fará referência a outra tabela, AllObjects: (ObjectId, DeviceId, DeviceObjectId). Em seguida, quando o dispositivo envia um conjunto de alterações, ele passa o ID do dispositivo e o objectId do objeto de dados do núcleo no armazenamento de dados local. Em seguida, meu servidor de nuvem verificará o objectId e o ID do dispositivo na tabela AllObjects e encontrará o registro a ser alterado na tabela inicial.
- Todas as alterações devem ter registro de data e hora, para que possam ser mescladas.
- O dispositivo precisará pesquisar o servidor, sem consumir muita bateria.
- Os dispositivos locais também precisarão atualizar qualquer coisa mantida na memória se / quando as alterações forem recebidas do servidor.
Há mais alguma coisa que estou perdendo aqui? Que tipos de estruturas devo examinar para tornar isso possível?