Я пишу приложение, используя сопрограммы (приведенный ниже код значительно упрощен).Недавно я смотрел Практические сопрограммы , и немного запутался.Оказывается, я не знаю, когда использовать функцию расширения CoroutineScope
, а когда использовать функцию приостановки.
У меня есть mediator (Presenter / ViewModel / Controller / etc) который реализует CoroutineScope:
class UiMediator : CoroutineScope {
private val lifecycleJob: Job = Job()
override val coroutineContext = lifecycleJob + CoroutineDispatchersProvider.MAIN
// cancel parent Job somewhere
fun getChannel() {
launch {
val channel = useCase.execute()
view.show(channel)
}
}
}
бизнес-логика (Interactor / UseCase):
class UseCase {
suspend fun execute(): RssChannel = repository.getRssChannel()
}
и хранилище :
class Repository {
suspend fun getRssChannel(): RssChannel {
// `getAllChannels` is a suspending fun that uses `withContext(IO)`
val channels = localStore.getAllChannels()
if (channels.isNotEmpty()) {
return channels[0]
}
// `fetchChannel` is a suspending fun that uses `suspendCancellableCoroutine`
// `saveChannel` is a suspending fun that uses `withContext(IO)`
return remoteStore.fetchChannel()
.also { localStore.saveChannel(it) }
}
}
Итак, у меня есть несколько вопросов:
- Должен ли я объявить
Repository#getRssChannel
как функцию расширения CoroutineScope (потому что она порождает новые функции приостановки: getAllChannels
, fetchChannel
, saveChannel
)?Как я могу использовать его в UseCase
тогда? - Должен ли я просто обернуть
Repository#getRssChannel
в функцию coroutineScope
, чтобы все порожденные функции приостановки были потомками последней? - Или, может быть, это уже хорошо, и я ничего не должен менять.Когда тогда объявлять функцию как расширение
CoroutineScope
?