আপডেট: আমি প্রথম টাইমআউট ছাড়াই এবং তারপরে টাইমআউট দিয়ে যদি কোনও কর্টিন কার্যকর করি তবে এটি কাজ করে। তবে আমি যদি প্রথমে টাইমআউট দিয়ে কোনও কর্টিন কার্যকর করি তবে এটি আমাকে একটি ত্রুটি দেয়। একই হিসাবে Async জন্য যায়।
আমি একটি ডেমো কোটলিন মাল্টিপ্লাটফর্ম অ্যাপ্লিকেশন তৈরি করছি যেখানে আমি কোটারের সাথে একটি এপিআই কল চালাচ্ছি। আমি ktor অনুরোধে একটি কনফিগারযোগ্য টাইমআউট ফাংশন করতে চাই তাই আমি কর্টাইন স্তরে টাইমআউট সহ ব্যবহার করছি।
নেটওয়ার্ক এপিআই সহ আমার ফাংশন কল এখানে।
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
}
আইওএসমাইন মডিউলটির জন্য এখানে আমার অ্যাপডিস্প্যাচার ক্লাস।
@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()
}
}
}
}
সুতরাং সময়সীমা সহ ফাংশনটি আমাকে আইওএস ক্লায়েন্টে নিম্নলিখিত ত্রুটি দেয়।
kotlin.IllegalStateException: There is no event loop. Use runBlocking { ... } to start one.
আমি কোটলিন-কর্টিন-নেটিভের ১.৩.২-স্থানীয়-এমটি -১ সংস্করণ ব্যবহার করছি। আমি নিম্নলিখিত URL এ একটি নমুনা ডেমো অ্যাপ্লিকেশন তৈরি করেছি। https://github.com/dudhatparesh/kotlin-multiplat-platform-example
1.3.3-native-mt
উল্লিখিত সংস্করণ চেষ্টা করছি । মনে হচ্ছে আমাদের ব্যবহার করা উচিত newSingleThreadContext
তবে এটি কোনও কারণে সমাধান হয় না।