更新:
如果我先执行一个没有超时的协程,然后再执行一个带有超时的协程,它就能工作。但如果我先执行一个带有超时的协程,那么就会出现错误。对于Async也是一样的。
我正在创建一个演示 Kotlin 多平台应用程序,在其中使用 ktor 执行 API 调用。 我希望在 ktor 请求上拥有可配置的超时函数,因此我在协程级别上使用了 withTimeout。
以下是我的网络 API 函数调用。
这是我为iOSMain模块编写的AppDispatcher类。
我正在使用 kotlin-coroutine-native 的 1.3.2-native-mt-1 版本。 我已经在以下网址创建了一个示例演示应用程序。 https://github.com/dudhatparesh/kotlin-multiplat-platform-example
我正在创建一个演示 Kotlin 多平台应用程序,在其中使用 ktor 执行 API 调用。 我希望在 ktor 请求上拥有可配置的超时函数,因此我在协程级别上使用了 withTimeout。
以下是我的网络 API 函数调用。
suspend fun <T> onNetworkWithTimeOut(
url: String,
timeoutInMillis: Long,
block: suspend CoroutineScope.() -> Any): T {
return withTimeout(timeoutInMillis) {
withContext(dispatchers.io, block)
} as T
}
suspend fun <T> onNetworkWithoutTimeOut(url: String, block: suspend CoroutineScope.() -> Any): T {
return withContext(dispatchers.io, block) as T
}
这是我为iOSMain模块编写的AppDispatcher类。
@InternalCoroutinesApi
actual class AppDispatchersImpl : AppDispatchers {
@SharedImmutable
override val main: CoroutineDispatcher =
NsQueueDispatcher(dispatch_get_main_queue())
@SharedImmutable
override val io: CoroutineDispatcher =
NsQueueDispatcher(dispatch_get_main_queue())
internal class NsQueueDispatcher(
@SharedImmutable private val dispatchQueue: dispatch_queue_t
) : CoroutineDispatcher() {
override fun dispatch(context: CoroutineContext, block: Runnable) {
NSRunLoop.mainRunLoop().performBlock {
block.run()
}
}
}
所以带有超时的函数会在iOS客户端中出现以下错误。
kotlin.IllegalStateException: There is no event loop. Use runBlocking { ... } to start one.
我正在使用 kotlin-coroutine-native 的 1.3.2-native-mt-1 版本。 我已经在以下网址创建了一个示例演示应用程序。 https://github.com/dudhatparesh/kotlin-multiplat-platform-example