Kotlin 多平台:如何在没有 runBlocking 的情况下以阻塞方式启动协程

Posted

技术标签:

【中文标题】Kotlin 多平台:如何在没有 runBlocking 的情况下以阻塞方式启动协程【英文标题】:Kotlin multiplatform: How to start coroutine blockingly without runBlocking 【发布时间】:2021-07-17 17:22:39 【问题描述】:

我使用 kotlin multiplatform,它禁止在公共代码中使用 runBlocking,因为 JS 实现不支持它。

我的目标是能够从我的非挂起函数中调用挂起函数,如下例所示。我也不关心 JS,因为我只会使用 JVM、androidios 目标

fun main() 
   runBlocking 
      doSomething()
   


suspend fun doSomething() 

我可以考虑的一个解决方案是创建预期和实际类,并在每个平台实际类上分别调用 runBlocking,但我想避免这种情况,因为它会导致一些代码重复。

 runBlocking 
      doSomething()
   

有没有更好的解决方案如何在公共模块中将阻塞和非阻塞代码桥接在一起?

【问题讨论】:

【参考方案1】:

在通用代码中你可以使用:

CoroutineScope(Dispatchers.Default).launch 

MainScope().launch 

取决于您需要的范围。

如果你的目标是 iOS,别忘了使用-native-mt 版本的协程,更多信息here

这不会像runBlocking 那样阻塞你当前的线程,所以如果你真的需要这个功能,你确实必须用expect/actual 来实现它,但我没有遇到类似的需求。

【讨论】:

以上是关于Kotlin 多平台:如何在没有 runBlocking 的情况下以阻塞方式启动协程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Kotlin Multiplatform(纯 kotlin)中进行延迟

Kotlin 协程 异步 异步流

我如何在 swift Kotlin 多平台上使用 Flow?

Kotlin runBlocking 与 laucner标签 by协程

Kotlin 协程协程启动 ⑤ ( 协程作用域构建器 | runBlocking 函数 | coroutineScope 函数 | supervisorScope 函数 )

Kotlin 协程协程启动 ⑤ ( 协程作用域构建器 | runBlocking 函数 | coroutineScope 函数 | supervisorScope 函数 )