gpt4 book ai didi

kotlin - 可以使用冗余/嵌套的 withContext 调用吗?

转载 作者:行者123 更新时间:2023-12-04 13:07:06 26 4
gpt4 key购买 nike

我有一个用 Kotlin 编写的个人项目,我养成了非常慷慨地使用 withContext(...) 的习惯。在调用可能与 I/O 相关的任何内容时,我倾向于使用 withContext(Dispatchers.IO)

例如:

suspend fun getSomethingFromDatabase(db: AppDatabase) = withContext(Dispatchers.IO) {
return // ...
}

suspend fun doSomethingWithDatabaseItem(db: AppDatabase) {
val item = withContext(Dispatchers.IO) {
getSomethingFromDatabase(db)
}
// ...
}

您可以在第二个函数中看到多余的 withContext(Dispatchers.IO)。我在这里格外小心,因为我可能不知道/不记得 getSomethingFromDatabase 是否切换到适当的上下文。这会影响性能吗?这很糟糕吗?处理 Dispatchers 的惯用方式是什么?

注意:我知道以这种方式在不同的上下文之间切换是完全没问题的,但是这个问题专门针对使用相同的上下文

最佳答案

除了调用需要特定上下文的代码之外,您不需要使用 withContext。因此,withContext(Dispatchers.Main) 只应在您使用需要主线程的 UI 函数时使用。并且您应该只在调用阻塞 IO 相关代码时使用withContext(Dispatchers.IO)

适当的挂起函数不会阻塞 (see Suspending convention section here),因此,您应该永远必须指定一个调度程序来调用挂起函数。异常(exception)情况是,如果您正在使用其他人的代码或 API,而他们错误地使用了挂起函数!

我不知道您的 AppDatabase 类是什么,但如果设计合理,它将公开挂起函数而不是阻塞函数,因此您不需要 withContext 从中检索值。但是,如果它确实公开了用于检索项目的阻塞函数,那么您的第一个函数的代码是正确的。

你的第二个函数绝对不需要 withContext 因为它只是用它来调用我可以看到的东西是一个挂起函数。

至于是否可以使用冗余上下文切换...除了可能浪费一点点时间和内存上下文切换以及无缘无故分配lambda之外,它没有任何伤害。而且它会降低您的代码的可读性。

关于kotlin - 可以使用冗余/嵌套的 withContext 调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68891909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com