更改完成块内的属性值

时间:2014-06-21 20:59:45

标签: ios properties closures swift completionhandler

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

我进入街区是因为我得到了#34;访问被授予"在我的输出中。 但是,当我想检查我的财产是否被更改时,它仍然表示它是错误的。 我也试过一个局部变量,但这也没有。

我做错了什么?

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!
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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,我们在块之后调用条件设置deviceAuthorized的值 - 您正在检查值的其他尝试该属性是在requestAccessForMediaType方法有机会完成并调用其完成块之前发生的,因此您在完成块有机会设置之前看到报告的值...这样您就能够在块有机会完成它之后看到值。