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
quelle
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.Antworten:
Wie im obigen Kommentar erwähnt, hatte ich ein ähnliches Problem, aber es stellte sich heraus, dass die
native-mt
Version aufgrund von transitiven Abhängigkeiten in anderen Bibliotheken nicht übernommen wurde. Folgendes hinzugefügt und es wird jetzt aufgelöst.Beachten Sie auch die Anleitungen unter https://github.com/Kotlin/kotlinx.coroutines/blob/native-mt/kotlin-native-sharing.md
Nutzen Sie dies in https://github.com/joreilly/PeopleInSpace
quelle
1.3.3-native-mt
? Ich bekommeCould not resolve org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.3.3. Required by: project :shared > io.ktor:ktor-client-ios:1.3.0 > io.ktor:ktor-client-ios-iosx64:1.3.0
Wenn Sie
[withTimeout]
Funktionen in Coroutinen verwenden möchten, müssen Sie Ihre ändernDispatcher
, um dieDelay
Schnittstelle zu implementieren . Hier ist ein Beispiel, wie dies erreicht werden kann:Diese Lösung kann leicht an Ihre Bedürfnisse angepasst werden.
Weitere Informationen finden Sie in diesem Thread .
quelle
Dispatchers.Unconfined
Dispatcher, deren Mechanismus dem von Ihnen beschriebenen ziemlich ähnlich ist. Sind Sie sich völlig sicher, wie Sie Ihre Coroutine starten?Manchmal hat die iOS-App eine andere asynchrone Anforderung mit einer Android-App. Verwenden Sie diesen Code für vorübergehende Versandprobleme
Weitere Informationen zu diesem Problem finden Sie im Forum: https://github.com/Kotlin/kotlinx.coroutines/issues/470
quelle