从异步闭包内部调用的 Swift 函数也是异步的?

标签 swift asynchronous grand-central-dispatch

假设我有一个异步闭包,我调用了一个我在其中编写的函数。这个函数是异步的还是在主队列上执行?

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

      self.myFunctionToDoSomething()          
})

我想知道如果我的函数需要很长时间才能执行,它会不会因为在主队列上执行而阻塞我的 UI?

此外,我在哪里可以找到有关此函数或任何其他 IOS 函数的完成处理程序的信息?这是我查看的页面,但它没有告诉我处理程序是否异步以及它在哪个队列上。

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

最佳答案

“异步”和“在主队列上执行”并不互斥。 myFunctionToDoSomething 声明将确定它是否是异步的,但无需执行任何特殊操作,它将在调用 captureStillImage... 的回调的任何队列上执行。您可以阅读文档以查看该队列是什么,但是如果您希望 myFunction 在特定队列上执行,您必须通过以下方式声明:

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

或者如果 myFunction... 是异步的,或者需要很长时间才能执行:

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

关于从异步闭包内部调用的 Swift 函数也是异步的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42705560/

相关文章:

ios - UIImage 遍历像素非常低效?

ios - 在UICollectionViewCell中使用Button编辑难点

ios - 苹果HLS离线视频播放如果网络不可用则无法播放2个视频

javascript - 加载异步 javascript 时触发事件

ios - 如何在异步线程中更新 ProgressView

ios - 如何在 swift 4 中正确实现 MessageKit? |未调用委托(delegate)函数

javascript - AngularJS : assign asynchronous data to an array element in a for loop

mysql - 在node.js中使用promise处理MySQL返回值

swift - NSMenu 打开时出现 NSAlert 会导致 UI 卡住

ios - 在这个 "starts busy"推测处理场景中使用 DispatchSemaphore