-1

我正在尝试用 Swift 重写 Apple 的 AVCam 示例。当我检查设备是否被授权时,我想将属性deviceAuthorized设置为 true 或 false。

我进入了块,因为我在输出中得到“访问被授予”。但是当我想检查我的财产是否被改变时,它仍然说它是假的。我也尝试过使用局部变量,但这也不起作用。

我究竟做错了什么?

var deviceAuthorized:Bool?

...

func checkDeviceAuthorizationStatus() -> Bool{
    var mediaType = AVMediaTypeVideo
    var localDeviceAuthorized:Bool = false

    AVCaptureDevice.requestAccessForMediaType(mediaType, completionHandler: {
        (granted:Bool) -> () in
        if(granted){
            println("Access is granted")
            self.deviceAuthorized = true
            localDeviceAuthorized = true
        }else{
            println("Access is not granted")

        }
    })

    println("Acces is \(localDeviceAuthorized)")
    return self.deviceAuthorized!
}
4

2 回答 2

0

尝试像这样编写完成块:

AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: {
    granted in      // no need to specify the type, it is inferred from the completion block's signature
    if granted {    // the if condition does not require parens
        println("Access is granted")
        self.deviceAuthorized = true
    } else {
        println("no access")
    }
    self.displayAuth()
    })

...然后添加一个实例方法displayAuth()

func displayAuth() {
    println("Access is \(deviceAuthorized)")
}

这将帮助您看到该属性确实是从块内设置的;我在这里添加的新方法,我们在您的条件设置值之后displayAuth从块内调用- 您为检查属性值所做的其他尝试是在该方法有机会完成并调用其完成之前发生的块,所以你在完成块有机会设置它之前看到报告的值......这样你就可以在块有机会做它的事情之后看到值。deviceAuthorizedrequestAccessForMediaType

于 2014-06-21T21:46:18.457 回答
0

您正在尝试 return self.deviceAuthorized!,但到那时完成处理程序不会运行。如果您试图通过查看此函数的返回值来检查属性的值,它将是完成处理程序运行之前的变量值。

于 2014-06-21T21:14:49.650 回答