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