2017-03-09 27 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()将需要很长时间才能执行,我可以假设它不会阻止我的用户界面?我在哪里可以找到文档来查看回调的队列是什么? – bakalolo

+0

如果需要很长时间,则不要在主队列上运行它。而是使用全局队列:DispatchQueue.global()。async {self.myFunctionToDoSomething() } –

+0

该文档说明您不应假定完成处理程序在特定线程上运行。通过在主线程上始终执行'myFunctionToDoSomething',您的解决方案会变得更糟,从而阻止用户界面。您应该将其更改为'DispatchQueue.global()。async {...}' –