Mise à jour: cela fonctionne si j'exécute d'abord une coroutine sans timeout puis avec Timeout. Mais si j'exécute d'abord une coroutine avec Timeout, cela me donne une erreur. il en va de même pour Async.
Je crée une application multiplateforme de démonstration kotlin où j'exécute un appel d'API avec ktor. Je veux avoir une fonction de timeout configurable sur demande ktor donc j'utilise withTimeout au niveau coroutine.
Voici mon appel de fonction avec l'API réseau.
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
}
Voici ma classe AppDispatcher pour le module 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()
}
}
}
}
donc la fonction avec le timeout me donne l'erreur suivante dans le client iOS.
kotlin.IllegalStateException: There is no event loop. Use runBlocking { ... } to start one.
J'utilise la version 1.3.2-native-mt-1 de la kotlin-coroutine-native. J'ai créé un exemple d'application de démonstration à l'URL suivante. https://github.com/dudhatparesh/kotlin-multiplat-platform-example
la source
1.3.3-native-mt
version mentionnée dans github.com/Kotlin/kotlinx.coroutines/issues/462 . Semble que nous devrions utiliser,newSingleThreadContext
mais cela ne résout pas pour une raison quelconque.Réponses:
Donc, comme mentionné dans le commentaire ci-dessus, j'ai eu un problème similaire, mais il s'est avéré qu'il ne récupérait pas la
native-mt
version en raison de dépendances transitives dans d'autres bibliothèques. Ajouté suivant et il se résout maintenant.Notez également les conseils dans https://github.com/Kotlin/kotlinx.coroutines/blob/native-mt/kotlin-native-sharing.md
Commencer à en faire usage dans https://github.com/joreilly/PeopleInSpace
la source
1.3.3-native-mt
? Je reçoisCould 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
Si vous souhaitez utiliser des
[withTimeout]
fonctions dans les coroutines, vous devez modifier votreDispatcher
pour implémenter l'Delay
interface. Voici un exemple de la façon dont cela peut être réalisé:Cette solution peut être facilement modifiée selon vos besoins.
Plus d'informations peuvent être trouvées dans ce fil .
la source
Dispatchers.Unconfined
répartiteur, dont le mécanisme est assez similaire à ce que vous décrivez. Êtes-vous sûr de la façon dont vous lancez votre coroutine?Parfois, l'application ios a une exigence asynchrone différente avec une application Android. Utilisez ce code pour un problème d'expédition temporaire
Veuillez consulter le forum pour ce problème: https://github.com/Kotlin/kotlinx.coroutines/issues/470
la source