Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ /

Managed uma sessão de sincronização - C++ SDK

Nesta página

  • Pré-requisitos
  • Obter a sessão de sincronização
  • Verifique a conexão de rede
  • Pausar ou retomar uma sessão de sincronização
  • Quando pausar uma sessão de sincronização
  • Aguarde as alterações para fazer upload e download
  • Verifique o estado de sincronização
  • Reconectar manualmente todas as sessões de sincronização

Quando você usa o Atlas Device Sync, o Realm C++ SDK sincroniza os dados com o Atlas em segundo plano usando uma sessão de sincronização. A sessão de sincronização começa quando você abre um domínio sincronizado.

A sessão de sincronização managed o seguinte:

  • Carregar e baixar alterações no Realm

  • Monitoramento do estado de sincronização

Antes de managed um estado de sessão de sincronização, você deve:

  1. Configurar o Flexible Sync no backend do Atlas App Services

  2. Abrir um realm sincronizado

Você pode usar a função de nó get_sync_session() para obter um objeto sync_session para qualquer Realm sincronizado. O SDK retorna este objeto como opcional. É um identificador leve que você pode passar por valor.

auto syncSession = realm.get_sync_session();

Dica

O design offline do SDK significa que, geralmente, você não precisa verificar o estado atual da conexão de rede. Dito isto, a propriedade connection_state() estará disponível se a sua aplicação chamar para obter alguma indicação do estado da conexão.

Para verificar o estado da conexão, você pode ler a propriedade connection_state() da instância de sessão de sincronização diretamente.

syncSession->connection_state();

Você também pode observar o estado da conexão com a função observe_connection_change() . Essa função registra um retorno de chamada que o SDK invoca quando a sessão de sincronização subjacente altera seu estado de conexão.

auto connectionToken = syncSession->observe_connection_change(
[&](enum realm::sync_session::connection_state,
enum realm::sync_session::connection_state new_state) {
// Register a block to execute when connection state changes.
});

Se você registrar um ouvinte de alteração de conexão, poderá cancelar o registro quando terminar de ouvir as alterações. Ligue para o método uneregister_connection_change_observer() da instância da sessão de sincronização para cancelar o registro de um token de observação.

syncSession->unregister_connection_change_observer(connectionToken);

O estado da conexão de rede é diferente do estado da conexão do Device Sync que você pode verificar com o método state() . Para obter mais informações sobre o estado da conexão de sincronização, consulte a documentação Verifique o estado de sincronização nesta página.

Você pode pausar e retomar a sessão de sincronização no Realm. Pausar uma sessão de sincronização suspende apenas a sessão de sincronização desse realm. Se você tiver mais de um Realm aberto, a suspensão não afetará a sessão de sincronização de outros Realms.

Para pausar uma sessão de sincronização, chame o método pausa() da sessão de sincronização.

syncSession->pause();

Para retomar uma sessão de sincronização, chame o método resume() da sessão de sincronização.

syncSession->resume();

Para a maioria dos aplicativos, não é necessário pausar e retomar manualmente uma sessão de sincronização. No entanto, existem algumas circunstâncias em que você pode querer pausar ou suspenso uma sessão de sincronização:

  • Você só quer sincronizar depois que o usuário executar uma ação específica

  • Você só deseja sincronizar durante um determinado horário do dia

  • Você não quer tentar sincronizar quando a conectividade de rede estiver ruim

  • Você deseja forçar explicitamente uma sessão de sincronização para se conectar

No caso de uma conectividade de rede ruim, tentar continuamente estabelecer uma conexão de rede pode esgotar a bateria do dispositivo do usuário.

O caso de forçar explicitamente uma sessão de sincronização para se conectar é mais comumente relacionado a estar offline por algum tempo. O cliente de sincronização tenta se conectar e, em caso de falha, entra em backoff exponencial. After being offline for a long time, the client may not immediately reconnect. Pausar e retomar a sessão de sincronização força explicitamente a conexão.

Ao pausar uma sessão de sincronização, lembre-se do seguinte:

  • Se o cliente ficar offline por mais tempo do que o tempo máximo offline do cliente , o cliente não conseguirá retomar a sincronização e deverá fazer um reinício do cliente.

  • Pausar uma sessão de sincronização a pausa em ambas as direções. As alterações feitas pelo seu aplicativo no dispositivo não são sincronizadas com o backend, e as alterações nos dados no backend ou em outros dispositivos não são sincronizadas com o dispositivo. Não há como pausar apenas uploads ou pausar apenas downloads.

  • Não pause uma sessão de sincronização se quiser que um cliente pare permanentemente de sincronizar com o backend. Para parar permanentemente a sincronização, copie o conteúdo do Realm sincronizado em um Realm não sincronizado e use o Realm não sincronizado no cliente.

Não pause a sincronização para parar a sincronização por períodos indefinidos ou intervalos de tempo em meses e anos. A funcionalidade não foi projetada ou testada para esses casos de uso. Você pode encontrar uma série de problemas ao usá-lo dessa forma.

Você pode usar os métodos wait_for_upload_completion() e wait_for_download_completion() de sync_session para aguardar as alterações para fazer upload ou download do Atlas. Ambos os métodos podem, opcionalmente, receber uma chamada de resposta de resposta para ser executado quando o upload ou o download for concluído.

Para aguardar todas as alterações para carregar no Atlas a partir do seu Realm sincronizado, use a função de membro wait_for_upload_completion().

syncSession->wait_for_upload_completion().get();

Para aguardar o download de todas as alterações do Atlas em seu Realm sincronizado, use a função de membro wait_for_download_completion(). Atualize o Realm depois de baixar quaisquer alterações para ter certeza de que ele reflete os dados mais recentes.

syncSession->wait_for_download_completion().get();
realm.refresh();

Você pode usar a função de membro público state() do sync_session para verificar se a sessão de sincronização está ativa. Isso retorna um enum cujo valor reflete possíveis estados do Device Sync.

syncSession->state();

O estado da conexão de sincronização é diferente do estado da conexão de rede que você pode verificar com o método connection_state() . Para obter mais informações sobre o estado da conexão de rede, consulte a documentação Verificar a conexão de rede nesta página.

O Realm detecta automaticamente quando um dispositivo recupera a conectividade depois de estar offline e tenta se reconectar usando uma estratégia de backoff incremental.

Você pode optar por trigger manualmente uma tentativa de reconexão com o método reconnect() de uma sessão de sincronização em vez de esperar pela duração do backoff incremental. Isso é útil se você tiver uma compreensão mais precisa das condições da rede e não quiser confiar na detecção automática de reconexão do Realm.

syncSession->reconnect();

Quando você chama esse método, o SDK força todas as sessões de sincronização a tentar se reconectar imediatamente. Isso redefine todos os temporizadores usados para backoff incremental.

Chamar esse método não garante que o dispositivo possa se reconectar. Se o SDK receber um erro fatal ou se o dispositivo já estiver conectado ou tentando se conectar, chamar esse método não terá efeito.

Importante

Não é possível reconectar dentro da duração do tempo limite de leitura do soquete

O Realm tem um tempo limite de leitura de soquete padrão interno de 2 minutos, onde o Realm atingirá o tempo limite se uma operação de leitura não receber nenhum dado dentro de uma janela de 2 minutos. Se você chamar reconnect() dentro dessa janela, o SDK não tentará se reconectar.

Voltar

Escreva para um domínio sincronizado