Actualización: funciona si primero ejecuto una rutina sin tiempo de espera y luego con Timeout. Pero si ejecuto primero una rutina con Timeout, entonces me da un error. Lo mismo ocurre con Async también.
Estoy creando una aplicación de demostración multiplataforma kotlin donde estoy ejecutando una llamada API con ktor. Quiero tener una función de tiempo de espera configurable a petición de ktor, así que estoy usando withTimeout a nivel de rutina.
Aquí está mi llamada de función con API de red.
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
}
Aquí está mi clase AppDispatcher para el módulo 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()
}
}
}
}
entonces la función con el tiempo de espera me da el siguiente error en el cliente iOS.
kotlin.IllegalStateException: There is no event loop. Use runBlocking { ... } to start one.
Estoy usando la versión 1.3.2-native-mt-1 de kotlin-coroutine-native. He creado una aplicación de demostración de muestra en la siguiente URL. https://github.com/dudhatparesh/kotlin-multiplat-platform-example
1.3.3-native-mt
mencionada en github.com/Kotlin/kotlinx.coroutines/issues/462 . Parece que deberíamos estar usando, newSingleThreadContext
pero eso no se resuelve por alguna razón.