ios – Semaphore.wait的目的是什么(超时:.now())?

ios – Semaphore.wait的目的是什么(超时:.now())?,第1张

概述看一些Apple代码示例,我发现了这个: func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { // wait() is used to drop new not 看一些Apple代码示例,我发现了这个:

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 @R_407_4403@ up a bunch of stale data.    if MetadataObjectsOverlayLayersDrawingSemaphore.wait(timeout: .Now()) == .success {        dispatchQueue.main.async {            // Some processing...            self.MetadataObjectsOverlayLayersDrawingSemaphore.signal()        }    }}

代码的上下文:这是使用视频捕获来检测QR代码(或任何其他代码)时的委托方法.
因为它每秒被触发多次(如果相机保持在相同的QR码上),则需要某种超时.

但dispatchSemaphore.wait(timeout:.Now())如何工作?为什么要检查它是否是.success?

解决方法 目的是评论说:

wait() is used to drop new notifications if old ones are still processing,to avoID @R_407_4403@ up a bunch of stale data.

它的工作原理如下:

>信号量创建的值为1.
>第一次调用MetadataOutput时,等待(timeout:.Now())
成功并将信号量的值减少到零.
开始处理数据.
>如果在处理之前再次调用MetadataOutput
完成后,信号量的值仍为零.
然后等待(超时:)将等待信号量变为
再次为正,但由于超时值为Now(),因此失败
立即返回.timedOut.
效果是忽略传入的数据,即MetadataOutput
回调方法立即返回.
>当数据处理完成后,
信号量发出信号,将值增加到1.
因此,下次调用回调时,
等待信号量将成功,数据将再次处理.

简而言之:

> wait(timeout:.Now())返回.success如果a在这种情况下,先前提交的块已发出完成信号提交新块以处理传入数据.> wait(timeout:.Now())返回.timedOut,如果之前的话提交的块仍在运行,在这种情况下是传入的数据被忽略了.

总结

以上是内存溢出为你收集整理的ios – Semaphore.wait的目的是什么(超时:.now())?全部内容,希望文章能够帮你解决ios – Semaphore.wait的目的是什么(超时:.now())?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1016564.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存