Menu Docs

Página inicial do DocsDesenvolver aplicaçõesAtlas Device SDKs

Managed sessões de sincronização - Swift SDK

Nesta página

  • Comportamento da conexão de sincronização
  • Verifique a conexão de rede
  • Suspender ou retomar uma sessão de sincronização
  • Quando pausar uma sessão de sincronização
  • Aguarde as alterações para fazer upload ou download
  • Verificar o progresso do upload e download de uma sessão de sincronização
  • Reconectar manualmente todas as sessões de sincronização

A abertura de um domínio sincronizado inicia uma SyncSession para esse domínio. O Realm Swift SDK fornece métodos para pausar e retomar manualmente uma sessão de sincronização.

Novo na versão 10.41.0.

No Realm Swift SDK versão 10.41.0 e posterior, o App Services tem como padrão compartilhar uma única conexão com o servidor para todos os domínios sincronizados abertos. Esta é uma mudança em relação às versões anteriores, em que a abertura de mais de um Realm sincronizado abria conexões adicionais com o servidor. A conexão com o servidor é independente do SyncSession e é baseada no usuário do App Services.

Você pode alterar esse comportamento na configuração do cliente do aplicativo.

Dica

O design offline do Realm significa que geralmente você não precisa verificar o estado atual da conexão de rede. Dito isto, a propriedade connectionState está disponível se a sua aplicação chamar alguma indicação do estado da conexão.

Você pode suspender 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 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.

Novidade na versão 10.45.0.

Para aguardar o upload ou download de todas as alterações do seu domínio sincronizado, chame realm.syncSession?.wait(for: ).

Este método utiliza um argumento ProgressDirection para especificar se deseja acompanhar o progresso do upload ou download.

Você pode usar esses métodos com a sintaxe async/await do Swift ou com a sintaxe de retorno de chamada. A versão de chamada de resposta, realm.syncSession?.wait(for:queue:block:), pode pegar uma fila para despachar a chamada de resposta e um bloco para invocar quando a espera for concluída.

Observação

As notificações de progresso da Flexible Sync ainda não são totalmente suportadas. Ao usar a Flexible Sync, os downloads só relatam notificações após a integração das alterações. A sincronização baseada em partição fornece notificações contínuas à medida que o download das alterações progride. Os carregamentos relatam notificações de progresso contínuo para ambos os modos de sincronização.

Novidade na versão 10.44.0.

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. Por exemplo, em plataformas Apple, o Realm escuta notificações de alteração de rede e Atlas Triggers automaticamente uma reconexão imediatamente após o recebimento de uma.

No Swift SDK versão 10.44.0 e posterior, você pode optar por trigger manualmente uma tentativa de reconexão com SyncSession.reconnect() 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.

let syncSession = realm.syncSession!
// Work with the realm. When you need to force the sync session to reconnect...
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 SyncSession.reconnect() dentro dessa janela, o Swift SDK não tentará se reconectar.

← Sincronizar dados em segundo plano - Swift SDK