Оновлення: працює, якщо спершу виконати супровід без таймауту, а потім - зTimeout. Але якщо я спочатку виконую програму зTimeout, то це дає мені помилку. те саме стосується і Async.
Я створюю багатоплатформенний додаток kotlin, де я виконую виклик API з ktor. Я хочу мати налаштовану функцію тайм-ауту на запит 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
}
Ось мій клас AppDispatcher для модуля 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()
}
}
}
}
тому функція з таймаутом дає мені таку помилку в iOS-клієнті.
kotlin.IllegalStateException: There is no event loop. Use runBlocking { ... } to start one.
Я використовую 1.3.2-native-mt-1 версію kotlin-coroutine-native. Я створив зразок демонстраційної програми за наступною URL-адресою. https://github.com/dudhatparesh/kotlin-multiplat-platform-example
1.3.3-native-mt
версія, зазначена в github.com/Kotlin/kotlinx.coroutines/isissue/462 . Здається, ми повинні використовувати, newSingleThreadContext
але це не вирішує з якихось причин.