4

我正在尝试coroutines在一个Kotlin Multiplatform项目中使用。我也没有这方面的经验。

我正在尝试调用此函数

fun startFlow {
    coroutineScope.launch { 
        withContext(defaultDispatcher) {
           myFlow.collect { next -> onNext(next) }
        } 
    }
}

coroutineScopeiOS是这个

val defaultScope: CoroutineScope = object : CoroutineScope {
    override val coroutineContext: CoroutineContext
        get() = SupervisorJob() + Dispatchers.Default
}

这不是给我这个问题的唯一调用,实际上所有调用coroutines似乎都因此错误而失败:

kotlin.IllegalStateException: There is no event loop. Use runBlocking { ... } to start one.

这就是我导入库的方式

val commonMain by getting {
        dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3")
        }
    }

我正在使用Kotlin1.4.31。此问题仅存在于 中iOSAndroid完美运行。

我不明白我是否遗漏了什么。

4

2 回答 2

13

对于 iOS,您需要使用后缀为“native-mt”的协程,更多信息请点击此处

所以将您的导入替换为

implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2-native-mt")

另请注意,根据文档

kotlinx.coroutines当使用其他也依赖kotlinx-coroutines. 你可以这样做strictly

implementation ("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2-native-mt"){
    version {
        strictly("1.5.2-native-mt")
    }
}

ps 新的原生并发模型可供预览。查看新内存模型迁移指南。此native-mt功能发布后将不再需要后缀。

于 2021-04-03T13:49:24.727 回答
1

您也可以使用常规coroutines库,但是您需要创建一个自定义CoroutineDispatcher,将任务发布到mainRunLoop上,例如:

object NSLooperDispatcher: CoroutineDispatcher() {
    override fun dispatch(context: CoroutineContext, block: Runnable) {
        NSRunLoop.mainRunLoop.performBlock {
            block.run()
        }
    }
}

// use custom dispatcher
withContext(NSLooperDispatcher) {
    myFlow.collect { next -> onNext(next) }
} 

切换线程native-mt存在协同程序分支明确指出的问题,因此使用它可能仍然是一个好主意。否则,您将被限制在一个主线程上。

于 2021-05-07T15:26:37.900 回答