Aggiornamento: funziona se eseguo prima una routine senza timeout e poi con Timeout. Ma se eseguo prima una routine con Timeout, allora mi dà un errore. lo stesso vale per Async.
Sto creando un'applicazione multipiattaforma demo kotlin in cui eseguo una chiamata API con ktor. Voglio avere una funzione di timeout configurabile su richiesta di Ktor, quindi sto usando withTimeout a livello di routine.
Ecco la mia chiamata di funzione con l'API di rete.
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
}
Ecco la mia classe AppDispatcher per il modulo iOSMain.
@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()
}
}
}
}
quindi la funzione con il timeout mi dà il seguente errore nel client iOS.
kotlin.IllegalStateException: There is no event loop. Use runBlocking { ... } to start one.
Sto usando la versione 1.3.2-native-mt-1 del kotlin-coroutine-native. Ho creato un'applicazione demo di esempio al seguente URL. https://github.com/dudhatparesh/kotlin-multiplat-platform-example
1.3.3-native-mt
versione menzionata in github.com/Kotlin/kotlinx.coroutines/issues/462 . Sembra che dovremmo usare, newSingleThreadContext
ma questo non si risolve per qualche motivo.