swift - 如何使用异步等待 Swift 5.5 等待 x 秒
问题描述
如何使用新的 Swift 5.5await
关键字等待一段时间?
通常,使用完成处理程序,您会通过使用DispatchQueue
's得到类似的东西asyncAfter(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中使用async
& ?await
解决方案
您可以使用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)
注意 sleep 是用 调用的try
。如果取消睡眠,则会引发错误。如果你不在乎它是否被取消,那try?
很好。
推荐阅读
- excel - 为什么 countblank 函数无法获取指定范围的值?
- json - python从json中提取特定键和值不起作用
- tsql - 关键字“ON”错误消息附近的语法不正确 - 编辑现有 SQL 查询
- java - 这是更新一对多表的最佳实践
- node.js - mongodb 将字符串从一个数组移动到另一个数组
- vim - vim - 用逗号分割行并为每个标记添加前缀
- javascript - ckeditor 删除表单标签
- azure - 将 Azure 数据工厂数据流中的数据合并到现有表中
- excel - Excel 日期 - 2 位数年份显示为 3 位数
- python - 如何将电子邮件正文设置为包含多字节字符的字符串?