Jokubas Trinkunas
10/01/2024, 2:21 PM<http://Dispatchers.IO|Dispatchers.IO>
in KMP common. The import import <http://kotlinx.coroutines.IO|kotlinx.coroutines.IO>
(from core-ios) is marked as "unused", when I am configuring the project to target android only (excluding all iOS targets for faster build). As far as I understood, it uses import kotlinx.coroutines.Dispatchers
when targetting JVM (from core-jvm) to reference the IO Dispatcher.
But when I am configuring the project to target both Android and iOS, the imports in common import <http://kotlinx.coroutines.IO|kotlinx.coroutines.IO>
as well as import kotlinx.coroutines.Dispatchers
are now required, because:
I don't really understand why there are different IO paths to import iOS/Android IO Dispatcher. Anyone could help me out to fix this unused import, when I just want to target Android?
See 🧵 for more
TLDR: android target only requires import kotlinx.coroutines.Dispatchers
, android + ios requires import kotlinx.coroutines.Dispatchers
and import <http://kotlinx.coroutines.IO|kotlinx.coroutines.IO>
Jokubas Trinkunas
10/01/2024, 2:27 PM// JVM implementation
public actual object Dispatchers {
@JvmStatic
public actual val Default: CoroutineDispatcher = DefaultScheduler
@JvmStatic
public actual val Main: MainCoroutineDispatcher get() = MainDispatcherLoader.dispatcher
@JvmStatic
public actual val Unconfined: CoroutineDispatcher = kotlinx.coroutines.Unconfined
@JvmStatic
public val IO: CoroutineDispatcher = DefaultIoScheduler // The reference of IO Dispatcher for JVM
@DelicateCoroutinesApi
public fun shutdown() {
DefaultExecutor.shutdown()
DefaultScheduler.shutdown()
}
}
@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
@Deprecated(message = "Should not be used directly", level = DeprecationLevel.HIDDEN)
public actual val <http://Dispatchers.IO|Dispatchers.IO>: CoroutineDispatcher get() = <http://Dispatchers.IO|Dispatchers.IO> // Conflict??
JVM Implemtatio referencing the <http://Dispatchers.IO|Dispatchers.IO>
from object, as you can see the actual val is shadowed..Jokubas Trinkunas
10/01/2024, 2:28 PM// iOS implementation
public actual object Dispatchers {
public actual val Default: CoroutineDispatcher = createDefaultDispatcher()
public actual val Main: MainCoroutineDispatcher
get() = injectedMainDispatcher ?: mainDispatcher
public actual val Unconfined: CoroutineDispatcher get() = kotlinx.coroutines.Unconfined // Avoid freezing
private val mainDispatcher = createMainDispatcher(Default)
private var injectedMainDispatcher: MainCoroutineDispatcher? = null
@PublishedApi
internal fun injectMain(dispatcher: MainCoroutineDispatcher) {
injectedMainDispatcher = dispatcher
}
internal val IO: CoroutineDispatcher = DefaultIoScheduler
}
internal object DefaultIoScheduler : CoroutineDispatcher() {
... // omitted
}
@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
public actual val <http://Dispatchers.IO|Dispatchers.IO>: CoroutineDispatcher get() = IO // The reference of IO dispatcher for Kotlin/Native targets
internal expect fun createMainDispatcher(default: CoroutineDispatcher): MainCoroutineDispatcher
Kotlin/Native implementation, reference is now a shadowed field