😇

callback & async/await from Swift

に公開

Tips💡

Swiftで非同期処理を書く方法をまだ理解できていなかったりする。他の言語だったら、Promise, async/awaitを使うことが多い。

Swiftにもasync/awaitはあるようだ....

非同期処理とは?

時間がかかる処理例えば、API通信をするときにおこないますね。他には、1秒経過したら、処理を実行するというのが、非同期処理だったりします。

call back

昔からある非同期処理の書き方。クロージャを使う。{}がネストするので、読みづらいかも💦
fun name() { i in }こんな感じで書きます。

import Foundation

/*
call back を使用した非同期処理
1秒後に時間を計測する。
*/
func workTIme(callback: @escaping (Int) -> Void) {
    // 1秒後に時間を計測する
    DispatchQueue.global().async {
        // 1秒待つ
        sleep(1)
        // 現在の時間を取得
        let time = Int(Date().timeIntervalSince1970)
        // コールバック関数を呼び出す
        callback(time)
    }
}

// 非同期処理を呼び出す
workTIme { time in
    print("call back time: \(time)")
}

async/await

「アシンク・アウェイト」、「エィシンク・アウェイト」と人によって読み方が違う....
他の言語だと、Promiseを簡単に書けるようにしたもの(シンタックスシュガー)ですね。

こんな感じで、処理を短く書けるようになります。

import Foundation

/*
async/await を使用した非同期処理
1秒後に時間を計測する。
*/

func workTime() async -> Int {
    // 1秒待つ
    await Task.sleep(1_000_000_000)
    // 現在の時間を取得
    let time = Int(Date().timeIntervalSince1970)
    return time
}

// 非同期処理を呼び出す
async {
    let time = await workTime()
    print("async/await time: \(time)")
}

おまけ Task

Taskなるものを使用した書き方もできます。上で書いたasyncの代わりに、Taskとかく動作が同じ機能を使うこともできます。

import Foundation
/*
async/await を使用した非同期処理
1秒後に時間を計測する。
*/

func workTime() async -> Int {
    // 1秒待つ
    await Task.sleep(1_000_000_000)
    // 現在の時間を取得
    let time = Int(Date().timeIntervalSince1970)
    return time
}

// Task を使用した非同期処理
Task {
    let time = await workTime()
    print("Task time: \(time)")
}

Discussion