Есть ли у Kotlin что-то, что работает точно так же, как "DispatchWorkItem" в swift?

Я хочу выполнить определенную функцию после некоторого тайм-аута или при соблюдении определенного условия. Я сделал то же самое в быстром использовании DispatchWorkItem и использовал

dispatchQueue?.asyncAfter(deadline: .now() + .seconds(10), execute: self.dispatchWorkItemForDevicesDiscovery!) 

чтобы запустить таймер и через 10 секунд будет выполнен связанный disptachWorkItem.

Как это сделать в Котлине?

1 ответ

Вы можете использовать сопрограммы Котлина для этого. Вы можете создать свою собственную функцию приостановки, которая проверяет заданное условие в любое количество раз.

suspend fun startConditionally(checkDelayMillis: Long = 10, condition: () -> Boolean, block: () -> Unit) {
    while (true) {
        if (condition()) { break }
        delay(checkDelayMillis)
    }

    block()
}


fun main() {
    var i = 0

    // make the condition be fullfilled after 1 sec.
    GlobalScope.launch {
        delay(1000)
        i = 1
    }

    GlobalScope.launch {
        startConditionally(condition = {
            i == 1
        }) {
            println("Hello")
        }
    }

    Thread.sleep(2000L)  // block main thread for 2 seconds to keep JVM alive
}

Вам нужно будет добавить зависимость, потому что сопрограммы не являются частью стандартной библиотеки.

Вот что вам нужно поместить в ваш pom.xml (для Maven):

<dependency>
    <groupId>org.jetbrains.kotlinx</groupId>
    <artifactId>kotlinx-coroutines-core</artifactId>
    <version>1.1.0</version>
</dependency>

Дополнительно вам необходимо активировать их:

<plugin>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-maven-plugin</artifactId>
    ...
    <configuration>
        <args>
            <arg>-Xcoroutines=enable</arg>
        </args>
    </configuration>
</plugin>

дальнейшее чтение

Другие вопросы по тегам