Cập nhật: Nó hoạt động nếu lần đầu tiên tôi thực hiện một coroutine mà không có thời gian chờ và sau đó với Timeout. Nhưng nếu tôi thực hiện một coroutine withTimeout trước thì nó sẽ báo lỗi. Async cũng vậy.
Tôi đang tạo một ứng dụng đa nền tảng kotlin demo, nơi tôi đang thực hiện lệnh gọi API với ktor. Tôi muốn có một chức năng hết thời gian cấu hình theo yêu cầu ktor vì vậy tôi đang sử dụng withTimeout ở cấp độ coroutine.
Đây là chức năng gọi của tôi với API mạng.
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
}
Đây là lớp AppDispatcher của tôi cho mô-đun 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()
}
}
}
}
vì vậy, chức năng hết thời gian sẽ cho tôi lỗi sau trong ứng dụng khách iOS.
kotlin.IllegalStateException: There is no event loop. Use runBlocking { ... } to start one.
Tôi đang sử dụng phiên bản 1.3.2 -igen-mt-1 của kotlin-coroutine -igen. Tôi đã tạo một ứng dụng demo mẫu tại URL sau. https://github.com/dudhatparesh/kotlin-multiplat-pl platform-example
1.3.3-native-mt
phiên bản thử được đề cập trong github.com/Kotlin/kotlinx.coroutines/issues/462 . Có vẻ như chúng ta nên sử dụng newSingleThreadContext
nhưng điều đó không giải quyết được vì một số lý do.