Есть ли у Kotlin что-то, что работает точно так же, как «DispatchWorkItem» в swift? - PullRequest
0 голосов
/ 22 января 2019

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

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

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

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

1 Ответ

0 голосов
/ 22 января 2019

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

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>

Дополнительная литература

...