はじめに
皆さん。こんにちは! DreamHanksのエルムです。
今回はデータストアのイベントについて説明していきます。
前回の記事は[第17回]リアルタイムです。
DataStoreは定期的にAmplifyのHubに状態の通知を公開します。ハブを購読することで、DataStoreの内部状態を把握することができます。イベントは以下の場合に公開されます。
- デバイスがネットワーク接続を失ったり、回復したりします。
- データはクラウドと同期しています。
- まだ同期されていない新しい保留中の変更があります。
以下の9つのDataStoreイベントが定義されています:
ネットワークステータス
DataStoreの起動時およびネットワークの状態が変化するたびに送信されます。
HubPayloadは NetworkStatusEventが含まれます:
- active(ブール値):データストアがクラウドに接続可能なネットワーク上にある場合はtrue、そうでない場合はfalseです。
サブスクリプションEstablished(設立)
DataStoreがすべてのモデルへのサブスクリプションの確立を完了したときにディスパッチされます。
HubPayload: N/A
シンク・クエリの開始
DataStoreが最初の同期クエリを実行しようとしているときにディスパッチされます。
HubPayloadは syncQueriesStartedEventが含まれます:
- models ([String]): 各モデルの名前の配列
モデルシンクド
モデルインスタンスがクラウドから同期された後、各モデルに対して1回ずつディスパッチされます。
HubPayloadは modelSyncedEventが含まれています:
- モデル: name (String): 同期されたモデルの名前
- isFullSync (Bool): 全モデルを取得する「フル」クエリでモデルが同期された場合はtrue
- isDeltaSync (Bool): 最後の同期以降の変更のみを取得する “delta “クエリでモデルが同期された場合、trueを返します。
- new (Int): ローカルストアに追加された新しいモデルインスタンスの数
- updated (Int): ローカルストアで更新された既存のモデルインスタンスの数
- deleted (Int): ローカルストアから削除されたモデルインスタンスの数
シンク・クエリ・レディ
すべてのモデルがクラウドから同期されたときに派遣されます。
HubPayload: N/A
レディ
データストア全体の準備が整ったときにディスパッチされ、この時点ですべてのデータが利用可能になります。
HubPayload: N/A
アウトボックス・ミューテーション・エンキュー
ローカルの変更がクラウドとの同期のために新たにステージングされたときにディスパッチされます。
HubPayloadは outboxMutationEventが含まれています。
- モデル: name (String): クラウドへの公開を待っているモデルの名前です。
- エレメント: model(モデル):公開されるモデルインスタンスです。
アウトボックス・ミューテーション・プロセスド
ローカルの変更がクラウドとの同期を終え、ローカルで更新されたときにディスパッチされます。
HubPayloadは outboxMutationEventが含まれています。
モデル:
- name(String):処理が終了したモデルの名前
エレメント:
- model(モデル):処理されるモデルインスタンス
- _version (Int): モデルインスタンスのバージョン
- lastChangedAt (Int): モデルインスタンスの最終変更時刻(Unix時間)
- _deleted (Bool): モデルインスタンスがクラウドで削除された場合はtrue
アウトボックスステータス
派遣された時期:
- データストアの起動
- ローカルミューテーションがアウトボックスにエンキューされるたびに
- ローカル・ミューテーションの処理が終わるたびに
HubPayloadは OutboxStatusEventが含まれます:
- isEmpty(ブール値):クラウドへのアップロードを保留しているローカル変更がないことを示すブール値
使用方法
ネットワークの状態がアクティブであるかどうかを確認するには、次のようなリスナーを設定します:
1 2 3 4 5 6 7 8 9 10 |
// リスナーの作成 const listener = Hub.listen('datastore', async hubData => { const { event, data } = hubData.payload; if (event === 'networkStatus') { console.log(`ユーザーがネットワークに接続しています: ${data.active}`) } }) // リスナーの削除 listener(); |
同期プロセス全体が終了するのを待つには、readyイベントを待つことができます:
1 2 3 4 5 6 7 8 9 10 |
// リスナーの作成 const listener = Hub.listen("datastore", async hubData => { const { event, data } = hubData.payload; if (event === "ready") { // クラウドからデータが同期されたらここで何かをします } }) // リスナーの削除 listener(); |
ここでは、空のDataStoreからスタートして同期を開始した場合に発生するイベントとペイロードの例を示します:
1 2 |
await DataStore.clear(); await DataStore.start(); |
これはログに記録されます:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Event: {"channel":"datastore","payload":{"event":"storageSubscribed"},"source":"","patternInfo":[]} Event: {"channel":"datastore","payload":{"event":"networkStatus","data":{"active":true}},"source":"","patternInfo":[]} Event: {"channel":"datastore","payload":{"event":"outboxStatus","data":{"isEmpty":true}},"source":"","patternInfo":[]} Event: {"channel":"datastore","payload":{"event":"subscriptionsEstablished"},"source":"","patternInfo":[]} Event: {"channel":"datastore","payload":{"event":"syncQueriesStarted","data":{"models":["ModelX","ModelY","ModelLala"]}},"source":"","patternInfo":[]} Event: {"channel":"datastore","payload":{"event":"modelSynced","data":{"isFullSync":true,"isDeltaSync":false,"counts":{"new":5,"updated":0,"deleted":2}}},"source":"","patternInfo":[]} Event: {"channel":"datastore","payload":{"event":"modelSynced","data":{"isFullSync":true,"isDeltaSync":false,"counts":{"new":296,"updated":0,"deleted":2}}},"source":"","patternInfo":[]} Event: {"channel":"datastore","payload":{"event":"modelSynced","data":{"isFullSync":true,"isDeltaSync":false,"counts":{"new":8155,"updated":0,"deleted":0}}},"source":"","patternInfo":[]} Event: {"channel":"datastore","payload":{"event":"syncQueriesReady"},"source":"","patternInfo":[]} Event: {"channel":"datastore","payload":{"event":"ready"},"source":"","patternInfo":[]} |
終わりに
今回の記事は以上になります。
次回は [第19回]Amplifyの他のメソッドを学びましょう。
ご覧いただきありがとうございます。
コメント