同期セッションの管理 - Flutter SDK
項目一覧
Atlas Device Sync を使用すると、Flutter SDK は 同期セッション を使用して、バックグラウンドで Atlas とデータを同期します。 同期セッションは、同期された Realm を開くたびに開始されます。
同期セッションは以下を管理します。
同期されたデータベースへの変更のアップロードとダウンロード
同期の一時停止と再開
同期の進行状況のモニタリング
ネットワーク接続のモニタリング
セッション にアクセスできます Realm .syncSession 邦土同期された Realm の プロパティ。
前提条件
同期セッションの状態を管理する前に、次の操作を実行する必要があります。
アップロードおよびダウンロードによる変更を待機
すべての変更が同期された Realm から Atlas にアップロードされるまで非同期に待機するには、 Session.waitForUpload() を呼び出します 。Atlas のすべての変更が同期された Realm にダウンロードされるまで非同期に待機するには、 Session.waitFor Download() を呼び出します。
// Wait to download all pending changes from Atlas await realm.syncSession.waitForDownload(); // Add data locally realm.write(() { realm.addAll<Car>([ Car(ObjectId(), "Hyundai"), Car(ObjectId(), "Kia"), Car(ObjectId(), "Lincoln") ]); }); // Wait for changes to upload to Atlas before continuing execution. await realm.syncSession.waitForUpload();
任意の CancelToken waitForUpload()
を追加できますwaitForDownload()
から および に渡す追加オプション。
final cancellationToken = CancellationToken(); final waitForDownloadFuture = realm.syncSession.waitForDownload(cancellationToken); cancellationToken.cancel(); final waitForUploadFuture = realm.syncSession.waitForUpload(cancellationToken); cancellationToken.cancel();
同期セッションの一時停止と再開
セッションの同期を一時停止するには、 Session.一時停止 () を呼び出します 。セッションが一時停止されている間は、Realm は Atlas と変更を同期しません。
変更の同期を再開するには、 Session.resume() を呼び出します。
同期セッションを一時停止して再開するリージョンごとに、 Session.pause()
とSession.resume()
を手動で呼び出す必要があります。 1 つのセッションの同期状態は、開いている他のセッションには影響しません。
次のコード ブロックは、これらのメソッドを呼び出す方法を示しています。
// Pause the sync session realm.syncSession.pause(); // Data that you add while the sync session is paused does not sync to Atlas. // However, the data is still added to the realm locally. realm.write(() { realm.addAll<Car>([ Car(ObjectId(), "Volvo"), Car(ObjectId(), "Genesis"), Car(ObjectId(), "VW") ]); }); // Resume sync session. Now, the data you wrote to the realm // syncs to Atlas. realm.syncSession.resume();
同期セッションを一時停止するタイミング
ほとんどのアプリケーションでは、同期セッションを手動で一時停止して再開する必要はありません。 ただし、同期セッションを一時停止または一時停止する必要がある状況もいくつかあります。
ユーザーが特定のアクションを実行した後にのみ同期したい場合
特定の時間のみ同期したい場合
ネットワーク接続が不十分な場合、同期は試行しないでください
同期セッションを明示的に接続するよう強制したい場合
ネットワーク接続が不十分な場合、ネットワーク接続を確立しようとすると、ユーザーのデバイスのバックアップが枯渇する可能性があります。
同期セッションを明示的に接続するよう 強制する 場合は、一時的にオフラインであることがほとんどです。 同期クライアントは接続を試み、失敗すると指数バックオフになります。 長時間オフラインになると、クライアントがすぐに再接続されないことがあります。 同期セッションを一時停止および再開すると、接続が明示的に強制されます。
同期セッションを一時停止するときは、次の点に注意してください。
クライアントがクライアントの最大オフライン時間よりも長時間オフラインになると、クライアントは同期を再開できなくなり、クライアント リセットを実行する必要があります。
同期セッションを一時停止すると、両方の方向で一時停止されます。 アプリがデバイスで行った変更はバックエンドと同期されず、バックエンドまたは他のデバイス上のデータに対する変更はデバイスに同期されません。 アップロードのみを一時停止したり、ダウンロードのみを一時停止したりする方法はありません。
クライアントがバックエンドとの同期を永続的に停止する場合は、同期セッションを一時停止しないでください。 同期を永続的に停止するには、同期された Realm の内容を同期されていない Realm にコピーし、クライアントで同期されていない Realm を使用します。
無期限の同期を停止するために、同期を一時停止しないでください。 この機能は、これらのユースケース向けに設計またはテストされていません。 この方法で使用すると、さまざまな問題が発生する可能性があります。
同期のアップロードとダウンロードの進行状況の監視
バージョン2.0.0での変更: transferredBytes
とtransferrableBytes
は非推奨になり、代わりにprogressEstimate
が採用されるようになりました
同期の進行状況をモニターするには、 SyncSession.getProgressStream() を呼び出します 。このメソッドは SyncProgress のストリームを返します progressEstimate
現在のアップロードまたはダウンロードに対して を提供するオブジェクト。
指定されたprogressEstimate
は、 0.0
から1.0
の値の範囲を持つ double です。 1.0
で、進行状況ストリームは完了します。
SyncSession.getProgressStream()
は 2 つの引数を取ります。
ADirectgression
upload
またはdownload
に設定できる列挙型。進行状況ストリームがアップロードの進行状況を監視するか、ダウンロードの進行状況を監視するかを指定します。プログレスモード 次のいずれかに設定できる列挙型。
reportIndefinitely
: コールバックが登録されていないまで通知を続けるように設定します。forCurrentlyOutstandingWork
:progressEstimate
が1.0
に達するまで通知を続けるように設定します。
final stream = realm.syncSession.getProgressStream( ProgressDirection.upload, ProgressMode.forCurrentlyOutstandingWork); double progressEstimate = -1; late StreamSubscription streamListener; streamListener = stream.listen((syncProgressEvent) { progressEstimate = syncProgressEvent.progressEstimate; if (progressEstimate < 1.0) { print('Upload progress: ${progressEstimate * 100}%'); } }, onDone: () { print('Upload progress: ${progressEstimate * 100}%'); print("Upload complete"); }, onError: (error) { print("An error occurred: $error"); streamListener.cancel(); });
Tip
Realm を初めて開くときに、 onProgress Callbackを使用して同期モニタリングを構成することもできます。
ネットワーク接続の監視
Session . connectionState を使用して現在のネットワーク接続の状態を取得できます 。これにより ConnectionState が返されます ネットワーク接続の状態を含む列挙型connected
disconnected
、 、またはconnecting
。
if (realm.syncSession.connectionState == ConnectionState.connected) { // ... do stuff }
Session . connectionStateChecks を使用したネットワーク接続の状態の監視 。このプロパティは、 ConnectionStatechange のストリームを返します ネットワーク接続が変更されたときに更新されるオブジェクト。現在と前のConnectionState
にはConnectionStateChange
からアクセスできます。
final connectionStream = realm.syncSession.connectionStateChanges; late StreamSubscription streamListener; streamListener = connectionStream.listen((connectionStateChange) { if (connectionStateChange.current == ConnectionState.connected) { print("Connected to Atlas Device Sync server"); streamListener.cancel(); } });
すべての同期セッションの手動再接続
Flutter SDK は、デバイスがオフラインになった後に接続を回復したことを自動的に検出し、増分バックオフ戦略を使用して再接続を試みます。
App.reconnect() メソッドtrigger を使用して再接続試行を手動で することを選択できます。 インクリメンタル バックオフの期間を待つ代わりに、これは、ネットワーク条件をより正確に理解し、自動再接続検出に依存したくない場合に便利です。
app.reconnect();
このメソッドを呼び出すと、SDK はすべての同期セッションに直ちに再接続を試み、増分バックオフに使用されるすべてのタイマーをリセットします。
重要
ソケット読み取りタイムアウト期間内に再接続できません
Flutter SDK の内部デフォルトのソケット読み取りタイムアウトは 2 分であり、読み取り操作が 2 分のウィンドウ内にデータを受信しない場合、SDK はタイムアウトになります。 そのウィンドウ内でApp.Sync.reconnect()
を呼び出すと、Flutter SDK は再接続を試行しません。