データの存在
Relayストアにキャッシュされているデータを再利用しようとするときに留意すべき重要な点は、そのデータのライフタイム、つまりストアに存在するかどうか、そしてどのくらいの期間存在するかを理解することです。
特定のクエリに対するRelayストア内のデータは、一般的に、クエリが最初にフェッチされた後、そのクエリが画面にレンダリングされている限り存在します。特定のクエリのデータをフェッチしたことがない場合、ストアには存在しません。
ただし、異なるクエリのデータをフェッチした後でも、フェッチしたすべてのデータを無期限にメモリに保持することはできません。時間の経過とともに、データが大きくなりすぎて古くなってしまうためです。これを軽減するために、Relayは_ガベージコレクション_と呼ばれるプロセスを実行して、使用されなくなったデータを削除します。
Relayのガベージコレクション
具体的には、Relayはアプリ内のコンポーネントによって参照されなくなったデータを削除することで、ローカルのインメモリ ストアでガベージコレクションを実行します。
ただし、これはキャッシュされたデータの再利用と矛盾する場合があります。後で再利用しようとする前にデータが削除されると、ネットワークリクエストを待たずに画面をレンダリングするためにそのデータを再利用できなくなります。これを解決するために、このセクションでは、再利用するデータが必要な限りキャッシュされるようにするために必要なことについて説明します。
注: 通常、ガベージコレクションとデータ保持の設定について心配する必要はありません。これは、RelayEnvironmentレベルでアプリのインフラストラクチャによって設定される必要があります。ただし、ここでは参考のために説明します。
クエリの保持
クエリを保持すると、そのクエリと変数のデータが削除(ガベージコレクション)されないことがRelayに示されます。複数の呼び出し元が単一のクエリを保持する場合があり、少なくとも1つの呼び出し元がクエリを保持している限り、ストアから削除されることはありません。
デフォルトでは、 `useQueryLoader` / `usePreloadedQuery` または他のAPIを使用するクエリコンポーネントは、マウントされている限りクエリを保持します。アンマウント後、クエリを解放します。つまり、クエリはその後いつでも削除される可能性があります。
コンポーネントのライフサイクル外で特定のクエリを保持する必要がある場合は、 `retain` 操作を使用できます。
// Retain query; this will prevent the data for this query and
// variables from being garbage collected by Relay
const disposable = environment.retain(queryDescriptor);
// Disposing of the disposable will release the data for this query
// and variables, meaning that it can be deleted at any moment
// by Relay's garbage collection if it hasn't been retained elsewhere
disposable.dispose();
- 前述のように、これにより、クエリコンポーネントがアンマウントされた後でもクエリを保持できるため、他のコンポーネントまたは同じコンポーネントの将来のインスタンスが保持されたデータを再利用できます。
Relayのガベージコレクションポリシーの制御
現在、ガベージコレクションの動作を制御するためにRelayストアに提供できるオプションは2つあります。
GCスケジューラ
`gcScheduler` は、Relayストアに提供できる関数であり、GC実行をいつスケジュールするかを決定します。
// Sample scheduler function
// Accepts a callback and schedules it to run at some future time.
function gcScheduler(run: () => void) {
resolveImmediate(run);
}
const store = new Store(source, {gcScheduler});
- デフォルトでは、 `gcScheduler` オプションが提供されない場合、Relayは `resolveImmediate` 関数を使用してガベージコレクションをスケジュールします。
- スケジューラ関数を提供することにより、時間やスケジューラの優先順位、またはその他のヒューリスティックに基づいて、GCスケジューリングの積極性をデフォルトよりも低くすることができます。慣例により、実装はコールバックをすぐに実行するべきではありません。
GC解放バッファサイズ
Relayストアは内部的に解放バッファを保持し、元の所有者によって解放された後でも、特定の(設定可能な)数のクエリを一時的に保持します(デフォルトでは、そのクエリをレンダリングするコンポーネントがアンマウントされたときに発生します)。これにより、以前にアクセスしたページ、タブ、またはコンテンツに移動したときにデータを再利用できる可能性が高くなります。
解放バッファのサイズを設定するには、Relayストアに `gcReleaseBufferSize` オプションを指定します。
const store = new Store(source, {gcReleaseBufferSize: 10});
- バッファサイズが0の場合は、解放バッファがない場合と同じです。つまり、クエリはすぐに解放され、収集されます。
- デフォルトでは、環境の解放バッファサイズは10です。
このページは役に立ちましたか?
いくつかの簡単な質問に答えることで、 サイトの改善にご協力ください。.