【问题标题】:Run AVCaptureDevice.requestAccess blocking运行 AVCaptureDevice.requestAccess 阻塞
【发布时间】:2018-07-05 12:30:15
【问题描述】:

在我的应用中,我想在用户按下相机按钮时请求相机访问权限,这会将他带到基于 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

}

【问题讨论】:

    标签: ios swift xcode


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 2020-12-21
      • 1970-01-01
      • 2019-04-10
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多