Pembaruan: Ini berfungsi jika saya pertama kali menjalankan coroutine tanpa batas waktu dan kemudian dengan TimeTime. Tetapi jika saya menjalankan coroutine withTimeout terlebih dahulu maka itu memberi saya kesalahan. Hal yang sama berlaku untuk Async juga.
Saya membuat aplikasi multiplatform demo kotlin tempat saya mengeksekusi panggilan API dengan ktor. Saya ingin memiliki fungsi batas waktu yang dapat dikonfigurasi pada permintaan ktor jadi saya menggunakan withTimeout di tingkat coroutine.
Inilah panggilan fungsi saya dengan API jaringan.
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
}
Ini adalah kelas AppDispatcher saya untuk modul 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()
}
}
}
}
jadi fungsi dengan batas waktu memberi saya kesalahan berikut di klien iOS.
kotlin.IllegalStateException: There is no event loop. Use runBlocking { ... } to start one.
Saya menggunakan versi 1.3.2-native-mt-1 dari kotlin-coroutine-native. Saya telah membuat contoh aplikasi demo di URL berikut. https://github.com/dudhatparesh/kotlin-multiplat-platform-example
1.3.3-native-mt
versi yang disebutkan di github.com/Kotlin/kotlinx.coroutines/issues/462 . Sepertinya kita harus menggunakan newSingleThreadContext
tetapi itu tidak menyelesaikan karena alasan tertentu.