首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用冗余/嵌套的withContext调用可以吗?

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

Stack Overflow用户
提问于 2021-08-23 11:32:56
回答 1查看 393关注 0票数 3

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

例如:

代码语言:javascript
复制
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的惯用方法是什么

注意:我知道用这种方式在不同的上下文之间切换是非常好的,但是这个问题是关于使用相同的上下文的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-23 13:17:00

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

正确的挂起函数不阻塞(see section here),因此,您不应该指定调度程序来调用挂起函数。例外情况是,如果您使用的是其他人的代码或API,而他们使用的挂起函数不正确!

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

第二个函数肯定不需要withContext,因为它只是用来调用一个挂起函数。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68891909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档