HelloCW
HelloCW

Reputation: 2285

What is the lifetime kotlinx.coroutines.coroutineScope in Kotlin?

The following code are from the project architecture samples at https://github.com/android/architecture-samples

What is the lifetime kotlinx.coroutines.coroutineScope in Kotlin? Will this function saveTask return as soon as the given block and all its children coroutines are completed?

If I pass a ViewModel.viewModelScope to DefaultTasksRepository instead of kotlinx.coroutines.coroutineScope, what are differents ?

BTW, it seems that the Code A don't pass any object of CoroutineScope, why?

Code A

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) }
        }
    }

    ...
}

Code 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
    }

   ...
}

Added content

To Animesh Sahu: Thanks!

Are you sure that "A coroutineScope is a factory function that creates a CoroutineScope" , the following code is source code, it seems that the return value is not the object of CoroutineScope.

Source Code

  public suspend fun <R> coroutineScope(block: suspend CoroutineScope.() -> R): R =
    suspendCoroutineUninterceptedOrReturn { uCont ->
        val coroutine = ScopeCoroutine(uCont.context, uCont)
        coroutine.startUndispatchedOrReturn(coroutine, block)
    }

Upvotes: 1

Views: 468

Answers (1)

Animesh Sahu
Animesh Sahu

Reputation: 8106

A coroutineScope is a factory function that creates a CoroutineScope with the same context as it was called with but overriding the Job of that context.

CoroutineScope has lifetime until it is cancelled by calling cancel() on it or calling cancel() on CoroutineScope.coroutineContext or explicitly calling on the attached job coroutineContext[Job].cancel().

a coroutineScope is just a wrapper that creates immediate CoroutineScope that cancels itself up after executing its childrens.

PS: coroutineScope function is used for parallel decomposition of tasks with a new Job instance for control over its children

Upvotes: 1

Related Questions