アプリ指向のオペレーションの具体例
from データレイヤの具体例を眺める
アプリ指向のオペレーションの具体例
オペレーションを画面よりも長く存続させる
ネットワーク リクエストの処理中にユーザーが画面から移動した場合
リクエストはキャンセルされる
結果はキャッシュに保存されない。
NewsRepository は、このロジックの実行に呼び出し元のCoroutineScopeを使用しない。
NewsRepository は代わりに、ライフサイクルにアタッチされた CoroutineScope を使用する
最新ニュースの取得は、アプリ指向のオペレーションにする必要がある
依存関係注入のベスト プラクティスに従うために、NewsRepository は独自の CoroutineScope を作成する代わりに、コンストラクタのパラメータとしてスコープを受け取る。
リポジトリは作業のほとんどをバックグラウンド スレッドで行う
CoroutineScope は Dispatchers.Default または独自のスレッドプールで構成する必要がある。
code:kotlin
class NewsRepository(
...,
// This could be CoroutineScope(SupervisorJob() + Dispatchers.Default).
private val externalScope: CoroutineScope
) { ... }
つまり、CoroutineScopeを引数で渡せるようにし、依存関係注入を行った
NewsRepository は外部 CoroutineScope を使用してアプリ指向のオペレーションを実行する準備ができている
データソースの呼び出しを実行して、そのスコープによって開始された新規コルーチンでその結果を保存する
code:kotlin
class NewsRepository(
private val newsRemoteDataSource: NewsRemoteDataSource,
private val externalScope: CoroutineScope
) {
/* ... */
suspend fun getLatestNews(refresh: Boolean = false): List<ArticleHeadline> {
return if (refresh) {
externalScope.async {
newsRemoteDataSource.fetchLatestNews().also { networkResult ->
// Thread-safe write to latestNews.
latestNewsMutex.withLock {
latestNews = networkResult
}
}
}.await()
} else {
return latestNewsMutex.withLock { this.latestNews }
}
}
}
データレイヤの具体例を眺める#648b80b1e0be4c0000c64443の行、データレイヤの具体例を眺める#6486be77e0be4c00000da3f1より条件ゆるくなってるけどいいのか?
話の主題ではないので無視
alsoってなんだ?
スコープ関数/kotlinのひとつ
対象オブジェクトをブロック内にてラムダ引数として扱うことができ、戻り値はオブジェクト自身を返す
ほえ~