なおさんのブログ

iOSエンジニアのブログのはずがいろいろ書いてます。

Swiftのasync/awaitを試してみる

はじめに

Swift5.5からasync/awaitが使えるようになったのでどうやって使うのか調べてみました

サンプル実装

とりあえずviewDidLoad()に追加して実行してみました。

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        Task {
            print(Date().description)
            await waitMethod()
            print(Date().description)
            await waitMethod()
            print(Date().description)
        }
    }
    // 非同期メソッド
    func waitMethod() async {
        Thread.sleep(forTimeInterval: 10.0)
    }
}

結果

2021-11-11 01:31:22 +0000
2021-11-11 01:31:32 +0000
2021-11-11 01:31:42 +0000

10秒ごとにログが出力されました。きちんと非同期メソッドが終わってから次の処理が呼ばれているのがわかります。

サンプル実装2(同期・非同期の組み合わせ)

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        Task {
            print(Date().description)
            let msg = await msgMethod()
            print(Date().description)
            print(msg)
        }
    }
    // 非同期メソッド
    func msg1Method() async -> String {
        Thread.sleep(forTimeInterval: 10.0)
        return "msg1"
    }
    // 非同期メソッド
    func msg2Method() async -> String {
        Thread.sleep(forTimeInterval: 10.0)
        return "msg2"
    }
    // 非同期メソッドの同期
    func msgMethod() async -> String {
        async let msg1 = msg1Method()
        async let msg2 = msg2Method()
        return await msg1 + msg2
    }
}

結果 msg1Method()・msg2Method()は非同期に処理されて、msgMethod()で同期した文字列をきちんと返しています

2021-11-11 01:41:56 +0000
2021-11-11 01:42:06 +0000
msg1msg2

おまけ

iOS13でも動作する?って噂があったので実際に試してみました。 おもいっきり

only available in iOS 15.0 or newer

とエラーになりました。やっぱりiOS15以降でしか使えないってことでした。残念

参考資料

speakerdeck.com