Следующий код взят из примеров архитектуры проекта в https://github.com/android/architecture-samples
Каково время жизни kotlinx.coroutines.coroutineScope
в Kotlin? Будет ли эта функция saveTask
возвращаться, как только данный блок и все его дочерние сопрограммы будут завершены?
Если я передам ViewModel.viewModelScope
в DefaultTasksRepository
вместо kotlinx.coroutines.coroutineScope
, какие различия?
Кстати, кажется, что Код А не пропускает никакой объект CoroutineScope, почему?
Код А
import kotlinx.coroutines.coroutineScope
...
class DefaultTasksRepository(
private val tasksRemoteDataSource: TasksDataSource,
private val tasksLocalDataSource: TasksDataSource,
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) : TasksRepository {
...
override suspend fun saveTask(task: Task) {
coroutineScope {
launch { tasksRemoteDataSource.saveTask(task) }
launch { tasksLocalDataSource.saveTask(task) }
}
}
...
}
Код B
object ServiceLocator {
private val lock = Any()
private var database: ToDoDatabase? = null
...
private fun createTasksRepository(context: Context): TasksRepository {
val newRepo = DefaultTasksRepository(FakeTasksRemoteDataSource, createTaskLocalDataSource(context))
tasksRepository = newRepo
return newRepo
}
...
}
Добавлен контент
К аниме sh Саху: Спасибо!
Вы уверены, что " CoroutineScope - это фабричная функция, которая создает CoroutineScope ", следующий код является исходным кодом, похоже, что возвращаемое значение не является объектом CoroutineScope
.
Исходный код
public suspend fun <R> coroutineScope(block: suspend CoroutineScope.() -> R): R =
suspendCoroutineUninterceptedOrReturn { uCont ->
val coroutine = ScopeCoroutine(uCont.context, uCont)
coroutine.startUndispatchedOrReturn(coroutine, block)
}