看了一些苹果代码示例,我发现了这一点:
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
// wait() is used to drop new notifications if old ones are still processing, to avoid queueing up a bunch of stale data.
if metadataObjectsOverlayLayersDrawingSemaphore.wait(timeout: .now()) == .success {
DispatchQueue.main.async {
// Some processing...
self.metadataObjectsOverlayLayersDrawingSemaphore.signal()
}
}
}
代码的上下文:这是使用视频捕获检测 QR 码(或任何其他代码)时的委托方法。
因为它每秒被触发多次(如果相机停留在同一个二维码上),所以需要某种超时。
但如何DispatchSemaphore.wait(timeout: .now())
工作?为什么要检查它是否是.success
?
目的就是评论所说的:
wait() 用于在旧通知仍在处理时删除新通知,以避免排队一堆陈旧数据。
它的工作原理如下:
- 创建的信号量的值为 1。
- When
metadataOutput
被称为第一次,wait(timeout: .now())
成功并将信号量的值减为零。
数据处理开始。
- If
metadataOutput
再次被调用before处理有
完成后,信号量的值仍然为零。
然后wait(timeout:)
会等待信号量变成
再次为正,但由于超时值为now()
, 它失败
立即并返回.timedOut
。
效果是传入的数据被忽略,metadataOutput
回调方法立即返回。
- 当数据处理完成后,
信号量被发出信号,这会将值增加到 1。
结果,next调用回调的时间,
等待信号量成功,数据被再次处理。
简而言之:
-
wait(timeout: .now())
回报.success
如果一个
在这种情况下,先前提交的块已发出完成信号
提交一个新块来处理传入的数据。
-
wait(timeout: .now())
回报.timedOut
如果以前
提交的块仍在运行,在这种情况下传入的数据
被忽略。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)