2013-07-03 9 views
5

かかります。ただし、後でセッションを停止する:は、私は新しいセッションを作成し、このようにiPhone上でそれを開始8秒

[session stopRunning]; 

通常約8秒かかる!なぜこれが可能であり、それをより速くするために何ができるのか誰もが知っていますか?アップルのドキュメントから

+1

これを試してください:http://stackoverflow.com/questions/11905505/avcapturesession-stop-running-take-a-long-long-time – nickcheng

+1

はい、これは問題を解決するようです。答えとして追加すると、私はそれを受け入れます。 –

答えて

2

同様の問題が発生しました。 stopRunningを呼び出すと、アプリが8〜10秒間フリーズします。

私は最終的にこの問題を追跡しました。メインスレッド以外のスレッドでstopRunningを呼び出していました。このセカンダリスレッドは、AVCaptureSessionへのすべてのトランザクションに使用されました。この問題は、stopRunningへの呼び出しをディスパッチした後、完了するのを待っているメインスレッドをブロックしたために発生しました。残念なことに、stopRunningはメインスレッドに何かを投稿し、それが完了するのをブロックします。 (NSNotification *)nコールバック: エラードメイン= AVFoundationErrorDomainコード= -11819 "アクションを完了できません" UserInfo = 0x19e43c90 {NSLocalizedRecoverySuggestion =もう一度やり直してくださいNSLocalizedDescription =アクションを完了できない}

私の場合の解決策は、stopRunningを呼び出した後にメインスレッドをブロックしないことでした。幸いにも私にとっては簡単なことでした(とにかく、Appleが多かれ少なかれ推薦するもの)。

私は他の質問でこのテーマのバリエーションに気付きました。解決策は常にコードを修正することでした。うまくいけば、これはなぜ問題が発生しているのかをよりよく理解することができるでしょう。

+0

これは、セッションが開始する前に長い遅延を引き起こしていたメインスレッドから、私のアプリでstartRunning()を呼び出していることに気付きました。私はそれをメインスレッド上で実行するように変更し、再び正常に動作します。 –

3

Discussion

This method is used to stop the flow of data from the inputs to the outputs connected to the AVCaptureSession instance that is the receiver. This method is synchronous and blocks until the receiver has completely stopped running.

それは同期なので、あなたはUIスレッドを凍結避けるために、非同期呼び出しにそれを置くことができます。


追加のコメント:

アイデアは上記より速くstopRunningをしませんでした。 UIスレッドのフリーズを止めるだけです。

関連する問題