Обновление: это работает, если я сначала выполняю сопрограмму без таймаута, а затем с Тайм-аутом. Но если я сначала выполню сопрограмму с Timeout, то это выдаст мне ошибку. То же самое относится и к Async.
Я создаю демонстрационное мультиплатформенное приложение kotlin, в котором я выполняю вызов API с помощью ktor. Я хочу иметь настраиваемую функцию тайм-аута по запросу ktor, поэтому я использую withTimeout на уровне сопрограмм.
Вот мой вызов функции с сетевым 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
но это не решает по какой-то причине.Ответы:
Итак, как уже упоминалось в комментарии выше, у меня была похожая проблема, но оказалось, что она не выбирала
native-mt
версию из-за переходных зависимостей в других библиотеках. Добавлено следующее, и теперь оно разрешается.Также обратите внимание на руководство в https://github.com/Kotlin/kotlinx.coroutines/blob/native-mt/kotlin-native-sharing.md
Начиная использовать это в https://github.com/joreilly/PeopleInSpace
источник
1.3.3-native-mt
? Я получаюCould not resolve org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.3.3. Required by: project :shared > io.ktor:ktor-client-ios:1.3.0 > io.ktor:ktor-client-ios-iosx64:1.3.0
Если вы хотите использовать
[withTimeout]
функции в сопрограммах вы должны изменять вашDispatcher
реализоватьDelay
интерфейс. Вот пример того, как этого можно достичь:Это решение может быть легко изменено для ваших нужд.
Более подробную информацию можно найти в этой теме .
источник
Dispatchers.Unconfined
диспетчер, у которого механизм довольно похож на тот, который вы описываете. Вы полностью уверены в том, как вы запускаете свою сопрограмму?Иногда приложение ios имеет другое требование асинхронности с приложением для Android. Используйте этот код для временной проблемы отправки
Пожалуйста, посетите форум по этой проблеме: https://github.com/Kotlin/kotlinx.coroutines/issues/470
источник