업데이트 : 시간 초과없이 코 루틴을 먼저 실행 한 다음 시간 초과로 작동하면 작동합니다. 그러나 먼저 timeout with coroutine을 실행하면 오류가 발생합니다. Async도 마찬가지입니다.
ktor로 API 호출을 실행하는 데모 kotlin 멀티 플랫폼 응용 프로그램을 만들고 있습니다. 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
}
iOSMain 모듈의 AppDispatcher 클래스는 다음과 같습니다.
@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.
kotlin-coroutine-native의 1.3.2-native-mt-1 버전을 사용하고 있습니다. 다음 URL에서 샘플 데모 애플리케이션을 작성했습니다. https://github.com/dudhatparesh/kotlin-multiplat-platform-example
1.3.3-native-mt
에 언급 된 버전 github.com/Kotlin/kotlinx.coroutines/issues/462을 . 우리가 사용해야 newSingleThreadContext
하지만 어떤 이유로 든 해결되지 않는 것 같습니다 .