Update: Es funktioniert, wenn ich zuerst eine Coroutine ohne Timeout und dann mit Timeout ausführe. Wenn ich aber zuerst eine Coroutine mit Timeout ausführe, wird mir ein Fehler angezeigt. Gleiches gilt auch für Async.
Ich erstelle eine Demo-Kotlin-Multiplattform-Anwendung, in der ich einen API-Aufruf mit ktor ausführe. Ich möchte eine konfigurierbare Timeout-Funktion auf ktor-Anfrage haben, also verwende ich withTimeout auf Coroutine-Ebene.
Hier ist mein Funktionsaufruf mit Netzwerk-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
}
Hier ist meine AppDispatcher-Klasse für das iOSMain-Modul.
@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()
}
}
}
}}
Die Funktion mit dem Timeout gibt mir im iOS-Client den folgenden Fehler.
kotlin.IllegalStateException: There is no event loop. Use runBlocking { ... } to start one.
Ich verwende die Version 1.3.2-native-mt-1 der Kotlin-Coroutine-native. Ich habe eine Beispiel-Demo-Anwendung unter der folgenden URL erstellt. https://github.com/dudhatparesh/kotlin-multiplat-platform-example
1.3.3-native-mt
die in github.com/Kotlin/kotlinx.coroutines/issues/462 erwähnte Version . Scheint, wir sollten verwenden, newSingleThreadContext
aber das löst sich aus irgendeinem Grund nicht.