อัปเดต: ใช้งานได้ถ้าฉันเรียกใช้งาน coroutine ครั้งแรกโดยไม่ต้องหมดเวลาและด้วย withTimeout แต่ถ้าฉันรัน coroutine ด้วย Timeout ก่อนมันจะทำให้ฉันมีข้อผิดพลาด กันไปสำหรับ Async เช่นกัน
ฉันกำลังสร้างแอพพลิเคชั่น kotlin Multicode ซึ่งฉันกำลังเรียกใช้ API ด้วย ktor ฉันต้องการมีฟังก์ชั่นไทม์เอาต์ที่กำหนดค่าได้ในคำขอ ktor ดังนั้นฉันจึงใช้ withTimeout ที่ระดับ coroutine
นี่คือการเรียกใช้ฟังก์ชั่นของฉันกับเครือข่าย 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/issues/462 ดูเหมือนว่าเราควรจะใช้newSingleThreadContext
แต่ไม่สามารถแก้ไขได้ด้วยเหตุผลบางอย่าง