अद्यतन: यह काम करता है अगर मैं पहली बार बिना टाइमआउट के एक कोरआउट को निष्पादित करता हूं और फिर टाइमटाइमआउट करता हूं। लेकिन अगर मैं पहले एक कोरटाउन को टाइमटाइमआउट के साथ निष्पादित करता हूं तो यह मुझे एक त्रुटि देता है। वही Async के लिए भी जाता है।
मैं एक डेमो कोटलिन मल्टीप्लायटर एप्लिकेशन बना रहा हूं जहां मैं ktor के साथ API कॉल निष्पादित कर रहा हूं। मैं ktor के अनुरोध पर एक कॉन्फ़िगर करने योग्य समयबाह्य कार्य करना चाहता हूं, इसलिए मैं coroutine स्तर पर withTimeout का उपयोग कर रहा हूं।
यहाँ नेटवर्क एपीआई के साथ मेरी फ़ंक्शन कॉल है।
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.
मैं कोटलिन-कोरटाइन-देशी के 1.3.2-देशी-एमटी -1 संस्करण का उपयोग कर रहा हूं। मैंने निम्नलिखित URL पर एक नमूना डेमो एप्लिकेशन बनाया है। https://github.com/dudhatparesh/kotlin-multiplat-platform-example
1.3.3-native-mt
किया जा सके .... github.com/Kotlin/kotlinx.coroutines/issues/462 में उल्लेखित संस्करण की कोशिश कर रहा है । ऐसा लगता है कि हमें उपयोग करना चाहिए newSingleThreadContext
लेकिन यह किसी कारण से हल नहीं होता है।