迅速,Kotlin是否具有与“ DispatchWorkItem”完全相同的功能?

时间:2019-01-21 22:19:46

标签: kotlin dispatchworkitem

我想在超时或满足某些特定条件后执行特定功能。我使用DispatchWorkItem并迅速使用了

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

启动计时器,并在10秒后执行相关的disptachWorkItem。

如何在Kotlin中做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以使用Kotlin的协程。您可以创建自己的暂停功能,该功能可以在任意数量的时间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>

Further reading