Atualização: Funciona se eu executar primeiro uma corotina sem tempo limite e depois com Timeout. Porém, se eu executar uma corotina com Timeout primeiro, isso me dará um erro. O mesmo vale para o Async também.
Estou criando um aplicativo multiplataforma de demonstração kotlin em que estou executando uma chamada de API com o ktor. Eu quero ter uma função de tempo limite configurável na solicitação do ktor, portanto, estou usando withTimeout no nível da corotina.
Aqui está minha chamada de função com a API da rede.
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
}
Aqui está minha classe AppDispatcher para o módulo 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()
}
}
}
}
então a função com o tempo limite me fornece o seguinte erro no cliente iOS.
kotlin.IllegalStateException: There is no event loop. Use runBlocking { ... } to start one.
Estou usando a versão 1.3.2-native-mt-1 do kotlin-coroutine-native. Eu criei um aplicativo de demonstração de exemplo no seguinte URL. https://github.com/dudhatparesh/kotlin-multiplat-platform-example
fonte
1.3.3-native-mt
versão de teste mencionada em github.com/Kotlin/kotlinx.coroutines/issues/462 . Parece que deveríamos estar usando,newSingleThreadContext
mas isso não resolve por algum motivo.Respostas:
Portanto, como mencionado no comentário acima, tive um problema semelhante, mas descobri que não estava pegando a
native-mt
versão devido a dependências transitivas em outras bibliotecas. Adicionado a seguir e está resolvendo agora.Observe também as orientações em https://github.com/Kotlin/kotlinx.coroutines/blob/native-mt/kotlin-native-sharing.md
Começando a usar isso em https://github.com/joreilly/PeopleInSpace
fonte
1.3.3-native-mt
? Eu receboCould 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
Se você quiser usar
[withTimeout]
funções em corotinas, precisará modificar sua interfaceDispatcher
para implementarDelay
. Aqui está um exemplo de como isso pode ser alcançado:Esta solução pode ser facilmente modificada para suas necessidades.
Mais informações podem ser encontradas neste tópico .
fonte
Dispatchers.Unconfined
despachante, que tem o mecanismo bastante semelhante ao que você está descrevendo. Você tem certeza absoluta da maneira como lança sua rotina?Às vezes, o aplicativo ios tem um requisito assíncrono diferente com um aplicativo Android. Use este código para problema de despacho temporário
Consulte o fórum para esse problema: https://github.com/Kotlin/kotlinx.coroutines/issues/470
fonte