[英]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.