Swift iOS アプリで別スレッドで非同期処理を行う

Swift で AVCaptureSession を扱う時とかに、AVCaptureSession.startRunning() の処理が重たいと感じたことがあるかもしれない。

そんな時は、以下のように書くことで、startRunning() の処理を別スレッドで非同期的に行わせられる。

DispatchQueue.global(qos: .userInitiated).async {
  self.captureSession.startRunning()
}

// すぐに後続のコードの処理に移ってくれる

startRunning() は、処理が重いため、ブロックしないようにする必要があります。

こう書くと、処理は裏で非同期に行われていて、並行して後続のコードに移ってくれる。startRunning() しながら他の処理を進めたい、といった場合に有用だ。

ただ、「この startRunning() の処理のあとにすぐ録画を開始したい」といった場合は、startRunning() だけを非同期処理に移してしまうと、キャプチャセッションが開始していない状態で startRecording() が呼び出されてしまう恐れがある。

そういう場合は、DispatchQueue を使わず、処理をブロックさせてでも連続して動作させる必要がある。

// セッション開始
captureSession.startRunning()
// 録画開始
fileOutput.startRecording()

非同期的に処理して良いところを見極めて使うことにしよう。