2017-03-05 10 views
5

ReactネイティブアプリをRelayと統合しているため、ユーザーにオフラインで初めての体験を提供したい。新鮮なデータを取得しているときに反応ネイティブアプリのリレーキャッシュデータを使用する

最初のアプリの起動時に、データの読み込み中にプレースホルダが表示されるはずです。その後、アプリが起動されるたびに、最新のデータがロードされている間に最後にキャッシュされたデータを表示したいと考えています。

私はthis issue from 2015を発見し、私はAsyncStorageを使用してrelay-cache-managerに基づいてCacheManagerを実装しようとしたeyston's answerに基づきます。 CacheManagerを使用すると、キャッシュからリレーレコードを保存して読み込むことができますが、ネットワークが無効になっていると、キャッシュされたデータを表示することはできません。

リレーが新しいデータをフェッチしている間にリレーキャッシュされたデータを使用する方法はありますか?

答えて

5

オフラインでの使用にRelayとRealmDBを使用する制作アプリがあります。 CacheManagerは当時まだ準備が整っていなかったので、CacheManagerとは別のアプローチをとった。これにはrelay-local-schemaを使用しました。

relay-local-schemaを使用してモバイルに必要なスキーマ全体を定義しました。これは、バックエンドサーバがgraphqlスキーマを定義するために使用するものと同じファイルであり、resolve関数を変更してrealm dbからデータを解決することができます。このため、realmdbにバックエンドサーバーから返されたデータを簡単に書き込むために、graphqlスキーマとほぼ同じ構造を持つrealmdbにスキーマを作成しました。また、graphqlイントロスペクションクエリを使用してこのスキーマの生成を自動化することもできます。私たちはcustom network layerを定義しました。ここでは、すべてのリレークエリが常にローカルデータベースに接触するようにしました。 sendQueries機能では、すべてのクエリが解決され、非常に高速に解決されるrelay-local-schemaが使用され、ビューには古いデータが表示され、同時に、sendQueries機能の各要求に対してネットワーク要求が行われます。ネットワーク要求からデータを受信すると、それはrealmdbに書き込まれ、Relayのメモリ内にも新しいデータが格納されます。これにより、データが変更されたすべての反応ビューが自動的にリフレッシュされます。メモリ内の店舗を中継するデータを書き込むために、我々は、以下の文書化されていないメソッドを使用

Relay.Store.getStoreData().handleQueryPayload(query, response); 

あなたはrequest.getQuery()を使用してsendQueries機能で受信リクエストからクエリオブジェクトを取得することができます。

私たちの現在の実装は、私たちのビジネスロジックと結びついているため、このロジックをオープンソース化することは困難です。私はデモアプリを提供しようとするつもりですが可能です。

+0

@meteorsにお返事ありがとうございます。 私はrelay-local-schemaを使うことを考えましたが、私のアプリで 'GraphQLSchema'をインポートするのが気に入らなかったので諦めました(スキーマは分離したプロジェクトで定義されています。それを結ぶ)。あなたの回答の後、[json-to-graphql-schema](https://github.com/aweary/json-to-graphql)リポジトリが見つかりました。私はbabel-relay-pluginで使用されているjsonスキーマを使用しようとします。 –

+0

あなたの実装を見てうれしいです。 ビジネスロジックとコードを分けてデモでリポジトリを作成するのは難しいかもしれないので、カスタムネットワークレイヤーのサンプルコードとRealmDBの更新を使って要点を作成できたらと思います。コードは= Dで動く必要はありません。 とにかく、ローカルスキーマを使ってアプローチを試してみましょう。私はいくつかの進歩を得るときにここで更新します。 –

+0

さて、すぐに要点やデモアプリを追加しようとします。 – meteors

関連する問題