async awaitでx秒待つ方法 Swift 5.5 質問する

async awaitでx秒待つ方法 Swift 5.5 質問する

await一定時間待機するために、新しい Swift 5.5 キーワードを使用するにはどうすればよいでしょうか?

通常、完了ハンドラでは、次のようにします。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 で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?十分です。

おすすめ記事