AVFoundation を用いて静止画とか動画とかを撮影する場合に、カメラの起動時間を速くする方法です。
計測してみると、どうも AVCaptureSession の startRunning に一番時間がかかってるので、
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ [self.captureSession startRunning]; dispatch_async(dispatch_get_main_queue(), ^{ // メインスレッドでの処理(UIまわり) }); });
こうすることで体感起動時間を速くできました。
(要は startRunning をバックグラウンドで処理するだけ)
ただ、AVCaptureSession の startRunning は非同期で行われていてそれ自体は速くはなっていないので、プレビュー用の AVCaptureVideoPreviewLayer を使い回している場合は、カメラ画面に遷移したあと startRunning が完了するまでの間、プレビューレイヤに前回撮影時の画像が描画されたままだったりします。その場合は、
self.previewLayer.hidden = YES; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ [self.captureSession startRunning]; dispatch_async(dispatch_get_main_queue(), ^{ self.previewLayer.hidden = NO; // メインスレッドでの処理(UIまわり) }); });
こんな感じで出したり隠したりして対処しました。
僕の実装ケースにしか当てはまらないのかもしれませんが・・