更改完成块内的属性值

Posted

技术标签:

【中文标题】更改完成块内的属性值【英文标题】:Change value of properties inside completion block 【发布时间】:2014-06-21 20:59:45 【问题描述】:

我正在尝试用 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!

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢!这确实是因为我在完成处理程序运行之前返回了。我以为这会立即完成。【参考方案2】:

尝试像这样编写完成块:

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,我们从块内调用 after 您的条件设置了deviceAuthorized 的值 - 您检查属性值的其他尝试是在requestAccessForMediaType 方法有机会完成并调用其完成块之前发生,因此您会在完成块有机会设置它之前看到报告的值......这样您将能够看到之后的值块有机会做它的事。

【讨论】:

以上是关于更改完成块内的属性值的主要内容,如果未能解决你的问题,请参考以下文章

更改 ruby​​ 块内的上下文/绑定

隐藏属性不能在动画块内更改

如何在 Mongoose 中更改文档子数组的对象内的布尔值?

PyQt5:属性值更改时通知

完成块内的 UIViewPropertyAnimator 状态?

完成块内的 RxSwift 订阅问题