😇
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