2017-03-09 2 views
0

Dites que j'ai une fermeture asynchrone et j'appelle une fonction que j'ai écrite à l'intérieur. Cette fonction va-t-elle être asynchrone ou exécutée sur la file d'attente principale?Fonction Swift appelée de l'intérieur Fermeture asynchrone également Asynchrone?

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

     self.myFunctionToDoSomething()   
}) 

Je voudrais savoir si ma fonction prend beaucoup de temps pour exécuter, serait-il bloquer mon interface utilisateur en cours d'exécution sur la file d'attente principale?

Où puis-je trouver des informations sur le gestionnaire de complétion pour cette fonction ou toute autre fonction IOS? C'est la page que j'ai regardée mais elle ne me dit pas si le gestionnaire est asynchrone ou non et dans quelle file il se trouve.

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

+0

Il s'exécutera sur le même thread que la fermeture asynchrone est en cours d'exécution. –

Répondre

3

"Asynchronous" et "exécuté sur la file d'attente principale" ne sont pas mutuellement exclusifs. La déclaration myFunctionToDoSomething déterminera si oui ou non il est asynchrone, mais sans faire quoi que ce soit de spécial, il sera exécuté sur n'importe quelle file d'attente captureStillImage... est appelé. Vous pouvez lire les documents pour voir ce que la file d'attente est, mais si vous voulez myFunction à exécuter sur une file d'attente spécifique que vous devez déclarer en disant:

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

Ou si myFunction... est asynchrone, ou prendra une longue temps d'exécution:

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

Donc, en supposant que myFunctionToDoSomething() prendra du temps à s'exécuter, je peux supposer qu'il ne bloquera pas mon interface utilisateur? Où puis-je trouver les documents pour voir quelle est la file d'attente de rappel? – bakalolo

+0

Si cela prend du temps, ne l'exécutez pas sur la file d'attente principale. Utilisez plutôt la file d'attente globale: DispatchQueue.global(). Async { self.myFunctionToDoSomething() } –

+0

La documentation indique que vous ne devez pas supposer que le gestionnaire d'achèvement s'exécute sur un thread spécifique. Votre solution l'aggrave en exécutant toujours 'myFunctionToDoSomething' sur le thread principal et ainsi bloquer l'interface utilisateur. Vous devriez le changer en 'DispatchQueue.global(). Async {...}' –