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以降でしか使えないってことでした。残念