はじめに
complitionハンドラーについて多くの記事や書籍を漁ってみたがどうにもイメージが掴みづらい。そのため、すごくざっくりとしたイメージを記事にまとめてみる。
complitionハンドラーについて
- 非同期処理では、リクエストを送る実行をしても望んでいるタイミングでレスポンスが返ってこないみたいなことがある。その望んでいるタイミングでレスポンスを受け取るために使うのがcomplitionハンドラーだと考える。
- 要は、complitionハンドラーを使って良きタイミングで確実に実行したい処理(レスポンス)をしましょうね、みたいなイメージ。 (これを俗に言う"コールバック"という)
- 基本的にはクロージャーの引数にcomplitionハンドラーを定義する。
Swift
let greet: String = "こんにちは"
let name: String = "山田太郎です"
//complitionハンドラー
//実行から数秒後(遅延処理を使う)にprint文を出力する関数。
//引数complitionは非同期処理を扱うcomplitionハンドラー
func timerComplition(time: Double, complition: @escaping () -> Void ) {
//遅延処理 (async == エイシンクと読む,非同期処理)
DispatchQueue.main.asyncAfter(deadline: .now() + time) {
//引数で指定したtimeの時間分遅延処理が終わったら、こちらも第二引数で指定したcomplitionハンドラーを呼ぶ
//complitionはクロージャーのため、最後は必ず()をつける。クロージャーを呼ぶ際は関数と同じような扱いなため()が必要
//イメージとしては、このcomplitionの中に実行したい処理を入れるイメージ
complition()
}
}
//遅延する時間を指定しつつ関数を使ってみる
timerComplition(time: 0) {
//省略したcomplition(ハンドラー内の)クロージャーで実行する処理
print(greet) //実行後、即こんにちはが出力
}
timerComplition(time: 2) {
//省略したcomplition(ハンドラー内の)クロージャーでする処理
print(name) //実行して2秒後に"山田太郎です"が出力
}
//ありそうな場面を想定して書いてみる
//ボタンを押したタイミングでcomplitionハンドラー走らせるみたいな()
//ViewDidLoadに書かなければいけないことはここでは省略させてください🙇♂️
@objc func greetButtonTap() {
timerComplition(time: 0) {
//省略されているcomplitionの中でprint文を定義
print(greet)
}
}
//こっちも同じ
@objc func nameButtonTap() {
timerComplition(time: 2) {
print(name)
}
}
//出力
//この二つのボタンを押したらという程で理解してください🙇♂️
@objc func greetButtonTap() //timeは0秒のため、実行して0秒後に”こんにちは”が出力
@objc func nameButtonTap() //timeは2秒のため、実行して2秒後に”山田太郎です”が出力
おわりに
記事の内容で誤った箇所がございましたらぜひご指摘ください。
参考記事
iOSアプリ開発のためにSwiftでクロージャを実用的に使う方法
開発環境
- Xcode-13.4.1
- Swift version 5.7