Monitore o progresso e o status da sincronização
Talvez você queira saber o status das operações de sincronização em seu aplicativo. Por exemplo, você pode querer que um código específico seja executado somente depois que todos os dados estiverem sincronizados com o App Services. Talvez você também queira fornecer aos usuários o status das operações de sincronização.
Você pode configurar sua sessão de sincronização para aguardar o upload ou download das alterações. Você também pode configurar sua sessão de sincronização para notificar quando o status da conexão de sincronização for alterado.
Aguarde o upload ou download das alterações
Para aguardar de forma assíncrona que suas alterações sejam concluídas, obtenha a sessão de sincronização da propriedadeRealms.Sync.SyncSession e, em seguida, chame o método session.WaitForUploadAsync() ou session.WaitForDownloadAsync() . Por exemplo:
using Realms.Sync; var realm = Realm.GetInstance(config); await realm.SyncSession.WaitForDownloadAsync();
Monitorar o progresso da sincronização
..versionchanged:: 12.0.0
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.
Para monitorar o progresso da sincronização, obtenha a sessão de sincronização na propriedade Realms.Sync.SyncSession e adicione uma notificação de progresso ligando para o método session.GetProgressObservable() .
O método session.GetProgressObservable usa os dois parâmetros a seguir:
Um parâmetro ProgressDirection que pode ser configurado para
UploadouDownload.Um parâmetro ProgressMode que pode ser definido como
ReportIndefinitelypara que as notificações continuem até que o registro da chamada de resposta de resposta seja cancelado, ouForCurrentlyOutstandingWorkpara que as notificações continuem até que somente os bytes atualmente transferíveis sejam sincronizados.
Ao assinar para receber as notificações, você recebe um objeto SyncProgress que fornece uma estimativa da porcentagem de dados restantes a serem transferidos como um valor entre 0 e..10
Exemplo
No exemplo a seguir, assinamos um progresso observável em session para ouvir eventos de upload. Quando esse chamada de resposta de chamada é acionado, ele imprime o progresso do upload como uma porcentagem.
var session = realm.SyncSession; var token = session.GetProgressObservable(ProgressDirection.Upload, ProgressMode.ReportIndefinitely) .Subscribe(progress => { Console.WriteLine($@"Current upload progress: {progress.ProgressEstimate * 100}%"); }); token.Dispose();
Quando você não desejar mais receber notificações, cancele o registro do token usando token.Dispose().
Obter alterações de estado de conexão
Para obter o estado da conexão de uma SyncSession, defina um manipulador de evento no evento PropertyChanged. O manipulador de evento é um delegado PropertyChangedEventHandler padrão do .NET que recebe um objeto sender e um objeto PropertyChangedEventArgs. No manipulador de evento , converta o destinatário em um objeto Session e verifique se a propriedade PropertyName do argumento do evento é Session.ConnectionState. Em seguida, você pode obter o valor ConnectionState, que será um dos seguintes:
Conectando
Conectado
desconectado
O código a seguir demonstra como definir o manipulador de eventos, converter o objeto de sessão e verificar o status da sincronização:
public void SetupRealm() { var appConfig = new AppConfiguration(myRealmAppId); app = App.Create(appConfig); user = app.LogInAsync(Credentials.Anonymous()).Result; config = new PartitionSyncConfiguration("myPartition", user); try { var realm = Realm.GetInstance(config); var session = realm.SyncSession; session.PropertyChanged += SyncSessionPropertyChanged!; realm.Dispose(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } private void SyncSessionPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(Session.ConnectionState)) { var session = (Session)sender; var currentState = session.ConnectionState; if (currentState == ConnectionState.Connecting) { //session is connecting } if (currentState == ConnectionState.Connected) { //session is connected } if (currentState == ConnectionState.Disconnected) { //session has been disconnected } } }