2017-03-09 11 views
0

私は非同期閉包を持っており、私はその中に書いた関数を呼び出します。この機能は非同期かメインキュー上で実行されますか?内部から呼び出されるSwift関数非同期クロージャも非同期ですか?

AVCaptureStillImageOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: {(sampleBuffer, error) in 

     self.myFunctionToDoSomething()   
}) 

私の機能が実行に時間がかかるかどうか知りたいのですが、メインキューで実行されてUIがブロックされますか?

また、この機能または他のIOS機能の完了ハンドラに関する情報はどこにありますか?これは私が見たページですが、ハンドラが非同期であるかどうか、どのキューがオンであるかはわかりません。 「メインキュー上で実行」

https://developer.apple.com/reference/avfoundation/avcapturestillimageoutput/1387374-capturestillimageasynchronously

+0

非同期クロージャが実行されているのと同じスレッドで実行されます。 –

答えて

3

「非同期」とは、相互に排他的ではありません。 myFunctionToDoSomething宣言は非同期かどうかを判断しますが、何も特別なことをせずにcaptureStillImage...のコールバックが呼び出されたときに実行されます。あなたは、そのキューが何であるかを確認するためにドキュメントを読むことができますが、myFunctionは、あなたが言っていることを宣言する必要が特定のキュー上で実行させたい場合は:

DispatchQueue.main.async { 
    self.myFunctionToDoSomething() 
} 

それともmyFunction...が非同期である、または長いを取る場合実行時間:

DispatchQueue.global().async { 
    self.myFunctionToDoSomething() 
} 
+0

myFunctionToDoSomething()を実行するのに時間がかかると仮定すると、UIがブロックされないと仮定できますか?また、コールバックのキューがどのようになっているかをドキュメントで確認できますか? – bakalolo

+0

時間がかかる場合は、メインキューで実行しないでください。代わりにグローバルキューを使用してください:DispatchQueue.global()。async { self.myFunctionToDoSomething() } –

+0

ドキュメントには、特定のスレッドで実行する完了ハンドラを想定しないでください。あなたの解決策は、メインスレッド上で常に 'myFunctionToDoSomething'を実行してUIをブロックすることによって悪化させます。 'DispatchQueue.global()。async {...} 'に変更してください。 –

関連する問題