Каков срок службы kotlinx.coroutines.coroutineScope в Kotlin? - PullRequest
0 голосов
/ 20 апреля 2020

Следующий код взят из примеров архитектуры проекта в 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)
    }

1 Ответ

1 голос
/ 20 апреля 2020

A coroutineScope - это заводская функция, которая создает CoroutineScope с тем же контекстом, в котором он был вызван, но переопределяет задание этого контекста.

CoroutineScope имеет время жизни, пока не будет отменено путем вызова cancel() для него или вызова cancel() для CoroutineScope.coroutineContext или явного вызова присоединенного задания coroutineContext[Job].cancel().

a coroutineScope - это просто оболочка, которая создает немедленный CoroutineScope, который отменяет себя после выполнения своих потомков.

PS: функция coroutineScope используется для параллельной декомпозиции задач с новым экземпляром Job для контроля над его потомками

...