2015-11-30 11 views
21

同期APIを使用してデータを取得するアプリがあり、すべてのデータをローカルに保存する必要があります。 データセット自体は非常に大きく、何千ものレコードが含まれている可能性があるため、データセット自体はメモリに格納するのが嫌です。実際のデータ構造は関係ないと思うので、オフラインでアクセスできる電子メールクライアントを構築していて、ストレージメカニズムをIndexedDB(非同期)にしたいとしましょう。Reduxと非常に大きなデータセットとIndexedDBを統合する方法

単純な解決策は、私の状態オブジェクトの一部としてデータ構造を持たず、状態に必要なデータ(例えば、EMAIL_OPENアクションがトリガされたときの状態の電子メールコンテンツを格納する)だけを入れることです。これは非常に単純です。

しかし、これは私は2つのことを妥協する必要があるわけないだろう:

  1. 真実で、それはあるものの、ユーザデータは、もはや「アプリケーションの状態」の一部です。同期の振る舞いは複雑なので、アプリ状態マシンから削除すると、還元概念の優雅さが損なわれます(私が理解する方法)
  2. 私はreduxアーキテクチャが本当に好きであり、すべてのロジックがそれを通過したいと思います、ビューの状態だけではありません。

メモリ不足状態のプロパティでreduxを使用する方法に関するベストプラクティスはありますか?私の頭を包み込むのが最も難しいのは、reduxが同期APIに依存しているため、状態オブジェクトを非同期状態オブジェクトに置き換えることができないということです(私はreduxを完全に削除し、自分自身の非同期実装とコネクタに置き換えない限り)。

私はGoogleを使用して回答を見つけることができませんでしたが、すでに十分なリソースがあれば、私も指摘したいと思います。

UPDATE: 質問は答えたが、私はそれを実装する方法に優れた外植を与えたかった、場合には、誰かがそれに実行されました:

主なアイデアは、単に使用して、クライアントとサーバの両方の変更リストを維持することですReduxのレデューサーは、クライアントの変更でサーバーを更新することもIDBを更新するために、これらの変更リストに耳を傾けるために、コネクタを使用し、そして:

  1. クライアントが変更を行い、クライアントの変更リストを更新するためにレデューサーを使用しています。
  2. サーバーから更新が送信されると、レデューサーを使用してサーバー変更リストを更新します。
  3. コネクタが保存をリッスンし、状態変更によりIDBが更新されます。変更された項目の内部リストも維持する。
  4. サーバーを更新するときは、変更された項目のリストを使用してIDBからデルタを取り出し、サーバーに送信します。
  5. データにアクセスする場合、(Reduxの-サンクを使用した例)IDBから引くために、通常のアクションを使用

このアプローチの唯一の注意点は、実際の状態以来、IDBに保存されていることであるので、我々はいくつかを失うん1つの状態オブジェクトを持つことの価値の(また巻き戻し/早送りの状態をより困難にする)

+0

私はあなたのために明確な答えはありません。なぜなら、レフィックス状態で大きなデータセットを保存することは知られていないと書かれているからです。私はちょうどTRYにアドバイスをして、redux&reactがメモリ内の負荷を処理できるかどうかを調べます。かなりシンプルなテストシナリオを作成し、それが機能するかどうかを調べることができます。 また、データメモリの効率的な格納と変更を最適化する 'ImmutableJS'のようなライブラリを使用することもできます。 これは何らかの形で役立ちます。それがどうなったか教えてください。私は本当にパフォーマンスが不思議です。 – JensDebergh

+0

私はモバイルをサポートしたいので、私のメモリ指紋はあまりにも大きくすることはできません。多くのデバイスでは、JSのメモリ割り当ては非常に小さく、大量のデータを格納することは本当に悪い考えです。 – AriehGlazer

答えて

19

あなたの最初の勘違いは正しいと思います。ストアにすべてを保存することができない場合(!)、ストア内のストアを少なくする必要があります。しかし、私はその解決策をより良くすることができると信じています。

IndexedDBはあなたが消費するサーバーAPIと同じように別のエンドポイントになります。サーバーからデータをフェッチするときは、それをIndexedDBに転送します。ここからStoreにデータが移入されます。ストアは必要以上のものを取得し、大きすぎたり古くなったりしない限りキャッシュします。

Facebookが消費しているAPIとはまったく違うものではありません。ストア内のユーザーのデータは決してすべてありません。参照はIDで実装され、必要に応じてロードされます。

あなたのロジックをすべて還元することができます。ユーザーアクションとデータ変更のためにいつものようにアクションを作成し、必要なデータを取得して処理してください。インターフェイスは、ユーザーデータによって完全に定義されています。必要なときに残りの部分にアクセスするために必要な情報をストア内に常に保持しているからです。ちょっと凝縮されています。 e。ユーザーがメッセージに移動するまで、メッセージの総数またはメールボックスのIDのみを保存します。

関連する問題