Corredor

ウェブ、プログラミングの勉強メモ。

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()

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

本気ではじめるiPhoneアプリ作り Xcode 9.x+Swift 4.x対応 (「ヤフー黒帯」シリーズ)

本気ではじめるiPhoneアプリ作り Xcode 9.x+Swift 4.x対応 (「ヤフー黒帯」シリーズ)