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

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

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

fun main() {
   runBlocking {
      doSomething()
   }
}

suspend fun doSomething() {
}

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

 runBlocking {
      doSomething()
   }

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

【问题讨论】:

    标签: kotlin kotlin-coroutines kotlin-multiplatform


    【解决方案1】:

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

    CoroutineScope(Dispatchers.Default).launch {
    }
    

    MainScope().launch {
    }
    

    取决于您需要的范围。

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

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

    【讨论】:

      猜你喜欢
      • 2020-04-19
      • 1970-01-01
      • 2020-11-08
      • 2019-02-19
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多