【问题标题】:How to await x seconds with async await Swift 5.5如何使用异步等待 Swift 5.5 等待 x 秒
【发布时间】:2021-10-13 08:04:24
【问题描述】:

如何使用新的 Swift 5.5 await 关键字等待一段时间?

通常,使用完成处理程序,您可以使用DispatchQueueasyncAfter(deadline:execute:) 获得类似的结果:

func someLongTask(completion: @escaping (Int) -> Void) {
    DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
        completion(Int.random(in: 1 ... 6))
    }
}

someLongTask { diceRoll in
    print(diceRoll)
}

如何在 Swift 5.5 中将其转换为使用 asyncawait

【问题讨论】:

    标签: swift concurrency swift5.5 swift-concurrency


    【解决方案1】:

    您可以使用Task.sleep(nanoseconds:) 等待特定的持续时间。这以 纳秒 为单位,而不是秒。

    这是一个例子:

    func someLongTask() async -> Int {
        try? await Task.sleep(nanoseconds: 1 * 1_000_000_000) // 1 second
        return Int.random(in: 1 ... 6)
    }
    
    Task {
        let diceRoll = await someLongTask()
        print(diceRoll)
    }
    

    使用睡眠扩展可能更容易,因此您可以在几秒钟内通过:

    extension Task where Success == Never, Failure == Never {
        static func sleep(seconds: Double) async throws {
            let duration = UInt64(seconds * 1_000_000_000)
            try await Task.sleep(nanoseconds: duration)
        }
    }
    

    现在应该这样称呼:

    try await Task.sleep(seconds: 1)
    

    请注意,使用try 调用睡眠。如果取消睡眠,则会引发错误。如果您不在乎是否取消,只需try? 即可。

    【讨论】:

    • 这个在早期测试版中实际上不起作用的错误是否已修复?
    • @matt 我现在运行良好,早期测试版有什么问题?
    • 任何超过几纳秒的时间我们都不会真正入睡。 :) 在我的 stackoverflow.com/a/67929769/341994 之后查看 cmets 无论如何,很高兴听到它现在正在工作!
    • @matt 啊,它现在正在工作。我也只是用常规的DispatchQueue 为示例计时,它们都花费了正确的时间(大致)。
    • 酷!很高兴知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2016-03-25
    • 2017-10-09
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多