🎯

AsyncCacheのススメ(非同期処理の多重実行防止のための個人的ベタープラクティス)

に公開
5

Discussion

あっぷる中谷あっぷる中谷

cacheStrategy = AsyncCache.ephemeral();

こちらあまり動きを理解できていないのですが、
UI側ではなくRiverpod等の実行元で

final AsyncCache<dynamic> _postCache = AsyncCache.ephemeral();
  Future<void> postHogehoge(String id) async {
    await _postCache.fetch(() async {
      state = const AsyncLoading();
      state = await AsyncValue.guard(() => _hogeRepository.postHogehoge(id));
    });
  }

しても同様の結果を得ることができるのでしょうか?

あっぷる中谷あっぷる中谷

ありがとうございます!
Riverpod内で宣言するとハッシュコードイコールじゃなくなってcacheが上手くいかない的な感じですかね??

なので宣言時にコンストラクタにAsyncCacheを渡してProviderがwatchされる事で一意のAsyncCacheになるから機能するという感じでしょうか??

あっぷる中谷あっぷる中谷

頂いたサンプルコードを使ってコンストラクタ宣言したAsyncCache.ephemeral()をProvider内部で変数宣言に変えて実行したところ同様の結果を得たように見えました!

公式ドキュメントを見ると
https://api.flutter.dev/flutter/async/AsyncCache/AsyncCache.ephemeral.html
という風に書いてあったので
ハッシュコードが違えどfinal宣言されたAsyncCache.ephemeral()に同一型の<T>リクエストが投げられる分には最大一回のみの実行が保証されるのかもしれません!

私の方でももう少し調査してみます🙇

8rine238rine23

あっぷる中谷さん、返信ありがとうございます。
お考えの通り、AsyncCache.ephemeral() は キャッシュするかどうかをハッシュコードが等しいかではなく、同一型の<T>リクエストが投げられたかどうかで判断しているため、AsyncCache.ephemeral()をProvider内部で変数宣言に変えても問題ありません。
サンプルコードでは、コンストラクタ経由で AsyncCache.ephemeral() を渡していましたが、これは私の手癖なので気にしないでください。