Usando Core Data, iCloud e CloudKit para sincronização e backup e como funcionam juntos

111

Estou nos estágios iniciais de criação de um aplicativo onde gostaria de salvar, sincronizar e fazer backup dos dados. O aplicativo não armazenará arquivos, apenas dados em um banco de dados. Será iOS 8 e superior, então posso usar o CloudKit. Eu fiz algumas pesquisas e ainda não tenho certeza de como Core Data, iCloud e CloudKit funcionam juntos.

Pelo que entendemos, o CloudKit é apenas uma maneira de obter e recuperar dados de / para a nuvem. O CloudKit é apenas uma maneira diferente de sincronizar dados com o iCloud?

Minhas perguntas são:

  1. Se eu usar o CloudKit, ainda preciso criar um banco de dados de dados de núcleo local?

    • Se sim, ele será sincronizado automaticamente com o iCloud ou terei que chamar métodos para armazenar em ambos os locais?
  2. Se os dados estiverem armazenados apenas na nuvem, o usuário poderá acessá-los quando o dispositivo iOS não estiver conectado à internet. Eu li que o CloudKit terá apenas cache limitado.

  3. Como isso funcionará se a conta iCloud não estiver habilitada.

Se alguém puder quebrar o que cada tecnologia faz no processo de salvar e sincronizar o banco de dados principal offline e online.

Meu entendimento atual é:

  • Core Data é usado para armazenar dados localmente

  • iCloud sincroniza os dados e armazena na nuvem

  • CloudKit dá a capacidade de armazenar e gerenciar dados na nuvem ??

Espero ter fornecido informações suficientes para que esta questão não seja encerrada.

Yan
fonte
2
Mesmo eu não fiz muita pesquisa sobre isso, mas pelo que entendi, não armazene no local. É algo como serviço de cliente de servidor normal. É por isso que sem internet você não consegue acessar seu banco de dados. e de acordo com o Doc, se o usuário não habilitou a conta do iCloud naquele momento, você só pode ler os dados do contêiner público
Sachin
@Yan podemos fazer assim, por favor sugira, stackoverflow.com/questions/25600556/…
Nikunj 01 de

Respostas:

183

É tipo isso:

  • O Core Data por si só é totalmente local e não funciona automaticamente com nenhum dos serviços em nuvem da Apple.
  • Core Data com iCloud habilitado ativa a sincronização via iCloud. Todas as alterações salvas no Core Data são propagadas para a nuvem e todas as alterações feitas na nuvem são baixadas automaticamente. Os dados são armazenados no iCloud e em um arquivo de armazenamento persistente local, portanto, estão disponíveis mesmo quando o dispositivo está offline. Você não tem que escrever nenhum código específico para a nuvem, você só precisa adicionar escuta para mudanças de entrada (que é muito parecido com mudanças feitas em um contexto de objeto gerenciado diferente).
  • O CloudKit não está relacionado aos dados principais. Não é um sistema de sincronização, é um sistema de transferência. O que significa que sempre que desejar ler / gravar dados na nuvem, você precisará fazer chamadas de API CloudKit explícitas para fazer isso. Nada acontece automaticamente. O CloudKit não armazena dados no dispositivo, portanto, os dados não estarão disponíveis se o dispositivo estiver offline. O CloudKit também adiciona alguns recursos não disponíveis para Core Data com iCloud - como dados públicos compartilhados e a capacidade de baixar apenas parte do conjunto de dados em vez de tudo.

Se você quiser usar CloudKit com Core Data, terá que escrever seu próprio código personalizado para traduzir entre objetos gerenciados e registros CloudKit. Não é impossível, mas é mais código para escrever. Ele pode ser mais confiável, mas é muito cedo para dizer com certeza.

Eu escrevi uma postagem no blog descrevendo o CloudKit da perspectiva de alguém que usou Core Data e iCloud no passado.

Atualização , junho de 2016: conforme a documentação mais recente doNSPersistentStoreCoordinator , tudo relacionado a Core Data com iCloud está marcado como obsoleto. Como resultado, provavelmente deve ser evitado para novos desenvolvimentos.

Tom Harrington
fonte
1
No passado, tive problemas com corrupção ao usar Core Data com iCloud, mas não o usei muito desde o lançamento do iOS 7. Deve ser muito melhor. Com o CloudKit é muito cedo para dizer, já que ainda não foi lançado oficialmente.
Tom Harrington
3
@Tom Harrington - Você poderia experimentar Core Data com iCloud para iOS 8 e nos dar sua impressão? Também experimentei muita corrupção no iOS 7 e o suporte da Apple confirmou muitos bugs. Espero que o iOS 8 leve sua confiabilidade a um nível aceitável, mas adoraria ouvir de você, o especialista;)
hyouuu
1
Confira CKSIncrementalStore. github.com/CloudKitSpace/CKSIncrementalStore
Nofel Mahmood
3
"Você não precisa escrever nenhum código específico para a nuvem, apenas precisa adicionar escuta para mudanças recebidas (que é muito parecido com as mudanças feitas em um contexto de objeto gerenciado diferente)." - você tem uma amostra / exemplo de código neste comentário? Não há exemplos sólidos que eu possa encontrar :(
Ernest
1
@TomHarrington com esse tipo de feedback, por que ter stackoverflow se tudo o que precisamos fazer é verificar a documentação :(
Ernest
14

Com o iOS 13, a Apple anunciou novos recursos no Core Data para trabalhar melhor com o CloudKit. A principal adição é NSPersistentCloudKitContainer que basicamente gerencia a sincronização entre Core Data e CloudKit para você.

Você pode aprender mais na sessão WWDC Using Core Data with CloudKit .

A Apple também lançou uma boa coleção de documentos para este uso: Espelhando um armazenamento de dados principais com CloudKit .

Pomme2Poule
fonte