【Swift】DispatchSemaphoreの使い方!非同期処理を待機する方法

この記事からわかること
- SwiftのDispatchSemaphoreの使い方
- 非同期処理を待機して実行する方法
- タイムアウトを設けるには?
\ アプリをリリースしました /
環境
- Xcode:15.0.1
- iOS:17.1
- Swift:5.9
- macOS:Sonoma 14.1
DispatchSemaphoreとは?
DispatchSemaphore
は複数のスレッドから操作される非同期処理を一元管理して同時にリソースを参照しないようにすることができるクラスです。仕組みとしては内部的にカウンターを保持しており、そのカウントが0の時は他の非同期処理は実行しないようにします。
DispatchSemaphore
クラスをインスタンス化する際に同時に実行できる非同期処理数を指定します。
そして非同期処理を開始する際にwait
メソッドを実行し、非同期処理を終了する際にsignal
メソッドを実行します。wait
メソッドを実行すると内部カウンターが-1
され、signal
メソッドを実行すると内部カウンターが+1
されます。
カウンターが0になっている間は他の非同期処理を開始することができません。そのため非同期処理が終了したタイミングで適切にカウンターを戻さないと動作しなくなってしまうので注意してください。
実装サンプル
例えば以下のような非同期処理が2つあるとします。
これをそのまま実行するとそれぞれの非同期処理は並列に動作するので出力は以下のようになります。
出力
DispatchSemaphore
を導入してみると2つの非同期処理は直列に実行されるようになります。
出力
タイムアウトを設ける
DispatchSemaphore
にはタイムアウトを設けることが可能です。このタイムアウトは指定した秒数の間非同期処理が開始にならなかった場合にタイムアウトを検出できます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。