await
一定時間待機するために、新しい Swift 5.5 キーワードを使用するにはどうすればよいでしょうか?
通常、完了ハンドラでは、次のようにします。DispatchQueue
の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
ベストアンサー1
iOS 16以降 / macOS 13以降
新しいAPIがあります。sleep(for:tolerance:clock:)
次のように使用します。
// 3 seconds
try await Task.sleep(for: .seconds(3))
iOS <16 / macOS <13
使用できます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
。sleep がキャンセルされるとエラーがスローされます。キャンセルされても構わない場合は、 だけでtry?
十分です。