同期セッションの管理 - C++ SDK
項目一覧
Atlas Device Sync を使用すると、Realm C++ SDK は 同期セッション を使用して、バックグラウンドで Atlas とデータを同期します。 同期された Realm を開くと、同期セッションが開始されます。
同期セッションは以下を管理します。
Realm への変更のアップロードとダウンロード
同期状態のモニタリング
前提条件
同期セッションの状態を管理する前に、次の操作を行う必要があります。
同期セッションを取得する
メンバー関数get_sync_session()を使用して、同期された任意の Realm のsync_sessionオブジェクトを取得できます。 SDK は、このオブジェクトを任意として返します。 値を渡すことができる軽量なハンドルです。
auto syncSession = realm.get_sync_session();
ネットワーク接続の確認
Tip
SDK のオフラインファーストの設計により、通常、現在のネットワーク接続状態を確認する必要はありません。 つまり、アプリが接続状態の指標として を呼び出す場合は、 connection_state()
プロパティが使用できます。
接続状態を確認するには、同期セッション インスタンスのconnection_state()
プロパティを直接読みとります。
syncSession->connection_state();
object_ connection_change()関数を使用して接続状態を監視することもできます。 この関数は、基礎となる同期セッションが接続状態を変更したときに SDK が呼び出すコールバックを登録します。
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. });
接続変更リスナーを登録した場合、変更をリッスンし終了したときに登録を解除できます。 同期セッション インスタンスのunreg Register_ connection_change_observer()メソッドを呼び出して、観察トークンの登録を解除します。
syncSession->unregister_connection_change_observer(connectionToken);
ネットワーク接続状態は、 state()
メソッドで確認できる Device Sync 接続状態とは異なります。 同期接続状態の詳細については、このページの 「同期状態を確認する」 ドキュメントを参照してください。
同期セッションの一時停止または再開
Realm で同期セッションを一時停止および再開できます。 同期セッションを一時停止すると、その Realm の同期セッションのみが一時停止されます。 オープンしている Realm が複数ある場合、一時停止は他の Realm の同期セッションに影響を与えません。
同期セッションを一時停止するには、同期セッションのpause()メソッドを呼び出します。
syncSession->pause();
同期セッションを再開するには、同期セッションのresume()メソッドを呼び出します。
syncSession->resume();
同期セッションを一時停止するタイミング
ほとんどのアプリケーションでは、同期セッションを手動で一時停止して再開する必要はありません。 ただし、同期セッションを一時停止または一時停止する必要がある状況もいくつかあります。
ユーザーが特定のアクションを実行した後にのみ同期したい場合
特定の時間のみ同期したい場合
ネットワーク接続が不十分な場合、同期は試行しないでください
同期セッションを明示的に接続するよう強制したい場合
ネットワーク接続が不十分な場合、ネットワーク接続を確立しようとすると、ユーザーのデバイスのバックアップが枯渇する可能性があります。
同期セッションを明示的に接続するよう 強制する 場合は、一時的にオフラインであることがほとんどです。 同期クライアントは接続を試み、失敗すると指数バックオフになります。 長時間オフラインになると、クライアントがすぐに再接続されないことがあります。 同期セッションを一時停止および再開すると、接続が明示的に強制されます。
同期セッションを一時停止するときは、次の点に注意してください。
クライアントがクライアントの最大オフライン時間よりも長時間オフラインになると、クライアントは同期を再開できなくなり、クライアント リセットを実行する必要があります。
同期セッションを一時停止すると、両方の方向で一時停止されます。 アプリがデバイスで行った変更はバックエンドと同期されず、バックエンドまたは他のデバイス上のデータに対する変更はデバイスに同期されません。 アップロードのみを一時停止したり、ダウンロードのみを一時停止したりする方法はありません。
クライアントがバックエンドとの同期を永続的に停止する場合は、同期セッションを一時停止しないでください。 同期を永続的に停止するには、同期された Realm の内容を同期されていない Realm にコピーし、クライアントで同期されていない Realm を使用します。
無期限の同期を停止するために、同期を一時停止しないでください。 この機能は、これらのユースケース向けに設計またはテストされていません。 この方法で使用すると、さまざまな問題が発生する可能性があります。
アップロードおよびダウンロードによる変更を待機
sync_session のwait_for_upload_completion()
メソッドとwait_for_download_completion()
メソッドを使用して、Atlas にアップロードまたはダウンロードする変更を待機できます。これらのメソッドではどちらも、アップロードまたはダウンロードが完了したときに実行するためのコールバックを受け取ることができます。
すべての変更が同期された Realm から Atlas にアップロードされるのを待つには、メンバー関数wait_for_upload_completion()
を使用します。
syncSession->wait_for_upload_completion().get();
Atlas からのすべての変更が同期された Realm にダウンロードされるまで待機するには、メンバー関数wait_for_download_completion()
を使用します。 変更をダウンロードした後、Realm を更新して、最新データが反映されていることを確認します。
syncSession->wait_for_download_completion().get(); realm.refresh();
同期状態の確認
同期セッションの公開メンバー関数state()
を使用して、同期セッションがアクティブかどうかを確認できます。 これにより、可能な Device Sync の状態を反映する値を持つ列挙型が返されます。
syncSession->state();
同期接続状態は、 connection_state()
メソッドで確認できるネットワーク接続状態とは異なります。 ネットワーク接続状態の詳細については、このページの 「ネットワーク接続の確認」 のドキュメントを参照してください。
すべての同期セッションの手動再接続
Realm は、デバイスがオフラインの後に接続を回復し、増分バックオフ戦略を使用して再接続を試みることを自動的に検出します。
triggerインクリメンタル バックオフの期間を待つ代わりに、同期セッションの reconnect() メソッドを使用して再接続試行を手動で することもできます。これは、ネットワーク条件をより正確に理解し、Realm の自動再接続検出に依存したくない場合に便利です。
syncSession->reconnect();
このメソッドを呼び出すと、SDK はすべての同期セッションに直ちに再接続を試行するように強制します。 これにより、増分バックオフに使用されるすべてのタイマーがリセットされます。
このメソッドを呼び出しても、デバイスが再接続できることは保証されません。 SDK で致命的なエラーが発生した場合、またはデバイスがすでに接続されているか、接続しようとしている場合、このメソッドを呼び出しても効果はありません。
重要
ソケット読み取りタイムアウト期間内に再接続できません
Realmの内部デフォルトのソケット読み取りタイムアウトは 2 分であり、読み取り操作が 2 分以内にデータを受信しない場合はRealmになります。 そのウィンドウ内でreconnect()
を呼び出すと、SDK は再接続を試行しません。