运行AVCaptureDevice.requestAccess阻止

时间:2018-07-05 12:30:15

标签: ios swift xcode

在我的应用中,我想在用户按下摄像头按钮时要求访问摄像头,这将使他进入基于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

}

1 个答案:

答案 0 :(得分:1)

一个简单的解决方案是创建一个信号量,然后等待直到调用完成闭包。 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()