Swift iOS アプリで別スレッドで非同期処理を行う
- 環境情報
- 対象 iOS バージョン : v11.3
- Xcode : v9.3 (9E145)
- Swift : v4.1 (swiftlang-902.0.48 clang-902.0.37.1)
Swift で AVCaptureSession
を扱う時とかに、AVCaptureSession.startRunning()
の処理が重たいと感じたことがあるかもしれない。
そんな時は、以下のように書くことで、startRunning()
の処理を別スレッドで非同期的に行わせられる。
DispatchQueue.global(qos: .userInitiated).async {
self.captureSession.startRunning()
}
// すぐに後続のコードの処理に移ってくれる
startRunning()
は、処理が重いため、ブロックしないようにする必要があります。
こう書くと、処理は裏で非同期に行われていて、並行して後続のコードに移ってくれる。startRunning()
しながら他の処理を進めたい、といった場合に有用だ。
ただ、「この startRunning()
の処理のあとにすぐ録画を開始したい」といった場合は、startRunning()
だけを非同期処理に移してしまうと、キャプチャセッションが開始していない状態で startRecording()
が呼び出されてしまう恐れがある。
そういう場合は、DispatchQueue
を使わず、処理をブロックさせてでも連続して動作させる必要がある。
// セッション開始
captureSession.startRunning()
// 録画開始
fileOutput.startRecording()
非同期的に処理して良いところを見極めて使うことにしよう。