谷歌架构示例中的 coroutineScope { launch { code } } 和 withContext(iODispatcher) { code } 有什么区别?

问题描述

代码:https://github.com/android/architecture-samples/blob/main/app/src/main/java/com/example/android/architecture/blueprints/todoapp/data/source/DefaultTasksRepository.kt

来自上述代码链接的片段:

    override suspend fun activateTask(taskId: String) {
        withContext(ioDispatcher) {
            (getTaskWithId(taskId) as? Success)?.let { it ->
                activateTask(it.data)
            }
        }
    }

    override suspend fun clearCompletedTasks() {
        coroutineScope {
            launch { tasksRemoteDataSource.clearCompletedTasks() }
            launch { tasksLocalDataSource.clearCompletedTasks() }
        }
    }

    override suspend fun deleteAllTasks() {
        withContext(ioDispatcher) {
            coroutineScope {
                launch { tasksRemoteDataSource.deleteAllTasks() }
                launch { tasksLocalDataSource.deleteAllTasks() }
            }
        }
    }

    override suspend fun deleteTask(taskId: String) {
        coroutineScope {
            launch { tasksRemoteDataSource.deleteTask(taskId) }
            launch { tasksLocalDataSource.deleteTask(taskId) }
        }
    }

什么时候使用哪个?

有时 coroutineScope { launch { code } } 位于 withContext(iODispatcher) 内!

何时使用:coroutineScope { launch { code } }

何时使用:withContext(iODispatcher)

何时嵌套使用它们:coroutineScope { launch { code } }withContext(iODispatcher)

解决方法

var timezone = /\b(?:[PMCEA][SDP]T|(?:Eastern|European|Summer) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{3})?)\b/g; 应该用于将 withContext(ioDispatcher) 内部运行的阻塞 IO 任务卸载到共享线程池。

{} 创建一个子作用域,它从父作用域的协程上下文继承 coroutineContext。它应该用于“并行分解工作”。这也意味着当作用域中的任何子协程失败时,作用域和任何其他子作用域也将被取消

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...