Aktualizacja: Działa, jeśli najpierw wykonam koronę bez limitu czasu, a następnie za pomocą Timeout. Ale jeśli najpierw wykonam coroutine za pomocą Timeout, wówczas pojawi się błąd. to samo dotyczy Async.
Tworzę demo wieloplatformową aplikację kotlin, w której wykonuję wywołanie API za pomocą ktor. Chcę mieć konfigurowalną funkcję limitu czasu na żądanie ktor, więc używam withTimeout na poziomie coroutine.
Oto moje wywołanie funkcji z interfejsem API sieci.
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
}
Oto moja klasa AppDispatcher dla modułu 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()
}
}
}
}
więc funkcja limitu czasu daje mi następujący błąd w kliencie iOS.
kotlin.IllegalStateException: There is no event loop. Use runBlocking { ... } to start one.
Używam 1.3.2-native-mt-1 wersji kotlin-coroutine-native. Utworzyłem przykładową aplikację demonstracyjną pod następującym adresem URL. https://github.com/dudhatparesh/kotlin-multiplat-platform-example
źródło
1.3.3-native-mt
wersji wymienionej w github.com/Kotlin/kotlinx.coroutines/issues/462 . Wydaje się, że powinniśmy używać,newSingleThreadContext
ale z jakiegoś powodu to nie rozwiązuje.Odpowiedzi:
Tak więc, jak wspomniano w powyższym komentarzu, miałem podobny problem, ale okazało się, że nie było to pobieranie
native-mt
wersji z powodu zależności przechodnich w innych bibliotekach. Dodano następujące i teraz rozwiązuje.Zwróć także uwagę na wytyczne w https://github.com/Kotlin/kotlinx.coroutines/blob/native-mt/kotlin-native-sharing.md
Rozpoczęcie korzystania z tego w https://github.com/joreilly/PeopleInSpace
źródło
1.3.3-native-mt
? RozumiemCould 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
Jeśli chcesz używać
[withTimeout]
funkcji w korporacjach, musisz zmodyfikować swój interfejs,Dispatcher
aby zaimplementowaćDelay
. Oto przykład, w jaki sposób można to osiągnąć:To rozwiązanie można łatwo zmodyfikować do własnych potrzeb.
Więcej informacji można znaleźć w tym wątku .
źródło
Dispatchers.Unconfined
dyspozytor, który ma mechanizm podobny do opisywanego. Czy jesteś w pełni pewien sposobu, w jaki wypuszczasz swoją korupcję?Czasami aplikacja ios ma inne wymagania asynchroniczne w stosunku do aplikacji na Androida. Użyj tego kodu, aby rozwiązać problem z tymczasową wysyłką
Zobacz forum tego problemu: https://github.com/Kotlin/kotlinx.coroutines/issues/470
źródło