存储库类中的协程范围

jam*_*s04 5 android repository mvvm kotlin kotlin-coroutines

假设我有一个 Dtos 列表,我想遍历它们并设置一些值,然后将它们插入/更新到我的 Room 数据库。所以从我的 ViewModel 我调用存储库类,在那里运行循环,然后我调用 dao.insertItems(list)。


fun updateItems(itemList: List<ItemDto>) {
        val readDate = DateUtils.getCurrentDateUTCtoString()
        ???SCOPE???.launch(Dispatchers.IO) {
            for (item in itemList)
                item.readDate = readDate
            itemDao.updateItems(itemList)
        }
    }

Run Code Online (Sandbox Code Playgroud)

问题是我必须在 Repository 类中使​​用什么样的 CourtineScope。我是否必须使用 Dispatchers.Main.. 创建一个 repositoryScope?也许是 GlobalScope ......?

Fra*_*esc 13

您应该将存储库 API 编写为suspend函数,如下所示

suspend fun updateItems(itemList: List<ItemDto>) = withContext(Dispatchers.IO) {
    val readDate = DateUtils.getCurrentDateUTCtoString()
    for (item in itemList)
        item.readDate = readDate
    itemDao.updateItems(itemList)
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果您需要在视图模型被销毁后运行它,请使用NonCancellable,

suspend fun updateItems(itemList: List<ItemDto>) = withContext(Dispatchers.IO + NonCancellable) {
    val readDate = DateUtils.getCurrentDateUTCtoString()
    for (item in itemList)
        item.readDate = readDate
    itemDao.updateItems(itemList)
}
Run Code Online (Sandbox Code Playgroud)

  • 是的。如果您需要函数在视图模型被销毁后继续运行,请使用未链接到视图模型生命周期的范围。 (2认同)