アプリ指向のオペレーションの具体例
アプリ指向のオペレーションの具体例
オペレーションを画面よりも長く存続させる
リクエストはキャンセルされる
結果はキャッシュに保存されない。
NewsRepository は、このロジックの実行に呼び出し元のCoroutineScopeを使用しない。
リポジトリは作業のほとんどをバックグラウンド スレッドで行う
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 }
}
}
}
話の主題ではないので無視
alsoってなんだ?
対象オブジェクトをブロック内にてラムダ引数として扱うことができ、戻り値はオブジェクト自身を返す
ほえ~