繁体   English   中英

运行AVCaptureDevice.requestAccess阻止

[英]Run AVCaptureDevice.requestAccess blocking

在我的应用程序中,我想在用户按下摄像头按钮时请求访问摄像头,这将使他进入基于AVFoundation的摄像头实时预览。

使用“当前模态搜索”呈现该视图。

因此,在我的ViewController中,我当前覆盖了shouldPerformSegue() ,如果用户已授予权限或已经授予了权限,则返回true,否则返回false。

如果用户未授予访问权限,我将显示一个警报,他可以在其中转到设置来更改权限。 这是在showPermissionInfo()

我的问题是, AVCaptureDevice.requestAccess是异步调用的,因此在我检查之前hasCameraPermission没有设置为true。 有没有一种方法可以以阻塞方式调用这些限制访问? 谢谢!

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {

    if identifier == "Modally_ToCameraViewController"
    {
        var hasCameraPermission = false

        if AVCaptureDevice.authorizationStatus(for: .video) ==  .authorized
        {
            hasCameraPermission = true
        } else {
            AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted: Bool) in
                if granted {
                    hasCameraPermission = true
                } else {
                    hasCameraPermission = false
                }
            })
        }


        if(!hasCameraPermission){
            showPermissionInfo()
        }

     return hasCameraPermission
    }

        return true

}

一种简单的解决方案是创建一个信号灯,然后等待直到完成完成调用被调用。 semaphore.wait将阻塞当前线程,直到调用semaphore.signal

let semaphore = DispatchSemaphore(value: 0)

AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted: Bool) in
    if granted {
        hasCameraPermission = true
    } else {
        hasCameraPermission = false
    }
    semaphore.signal()
})

semaphore.wait()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM