Güncelleme: İlk önce zaman aşımı olmadan bir coroutine çalıştırırsam ve ardından Timeout ile çalışır. Ama önceTimeout ile birlikte bir program çalıştırırsam bana bir hata verir. Async için de aynı şey geçerli.
Ktor ile bir API çağrısı yürüttüğüm bir demo kotlin çoklu platform uygulaması oluşturuyorum. Ben coroutine düzeyinde withTimeout ile kullanıyorum bu yüzden ktor istek üzerine yapılandırılabilir bir zaman aşımı işlevi olmasını istiyorum.
İşte ağ API ile benim işlev çağrısı.
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
}
İşte iOSMain modülü için AppDispatcher sınıfım.
@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()
}
}
}
}
böylece zaman aşımına sahip işlev iOS istemcisinde bana aşağıdaki hatayı veriyor.
kotlin.IllegalStateException: There is no event loop. Use runBlocking { ... } to start one.
Kotlin-coroutine-native'in 1.3.2-yerli-mt-1 versiyonunu kullanıyorum. Aşağıdaki URL'de örnek bir demo uygulaması oluşturdum. https://github.com/dudhatparesh/kotlin-multiplat-platform-example
1.3.3-native-mt
belirtilen versiyonunu github.com/Kotlin/kotlinx.coroutines/issues/462 . Kullanmalıyız gibi görünüyor, newSingleThreadContext
ancak bu herhangi bir nedenle çözülmüyor.