gpt4 book ai didi

ios - 为什么从闭包返回的变量总是落后一步

转载 作者:行者123 更新时间:2023-11-28 13:12:16 24 4
gpt4 key购买 nike

在以下代码中,闭包访问 REST API 以调用嵌入式 uC 上的函数,然后从 uC 读取值。问题是返回给下面变量“result”的值总是落后一步。意思是,当我打开 LED 并从光传感器请求光值时,我应该得到灯亮时的预期值。但我没有。我得到了关灯的值(value)。如果我然后关闭 LED,我会得到灯亮的值。我把设备放在我面前,所以我可以目视确认状态。

我的问题是,导致 result 的值落后一步的闭包行为是什么?有什么方法可以获取当前值,而不是先前的值?

@IBAction func lightOn(sender: AnyObject) {
let funcArgs = [1]
myPhoton!.callFunction("lightLed0", withArguments: funcArgs) { (resultCode : NSNumber!, error : NSError!) -> Void in
if (error == nil) {
self.lightStateLabel.text = "LED is on"
}
}
myPhoton!.getVariable("Light", completion: { (result:AnyObject!, error:NSError!) -> Void in
if let e = error {
self.getLightLabel.text = "Failed reading light"
}
else {
if let res = result as? Float {
self.getLightLabel.text = "Light level is \(res) lumens"
}
}
})



}


@IBAction func lightOff(sender: AnyObject) {
let funcArgs = [0]
myPhoton!.callFunction("lightLed0", withArguments: funcArgs) { (resultCode : NSNumber!, error : NSError!) -> Void in
if (error == nil) {
self.lightStateLabel.text = "LED is off"
}
}
myPhoton!.getVariable("Light", completion: { (result:AnyObject!, error:NSError!) -> Void in
if let e = error {
self.getLightLabel.text = "Failed reading light"
}
else {
if let res = result as? Float {
self.getLightLabel.text = "Light level is \(res) lumens"
}
}
})

}

最佳答案

我来猜一猜。

callFunction 使用 REST API。所以它是异步的。

getVariable 使用 REST API 并且也是异步的,或者使用由上次 REST 调用返回的本地状态记录。

充其量您已经创建了一个竞争条件,其中 callFunction 可能无法在 getVariable 之前完成。在最坏的情况下,基本上可以保证不会假设合理的并发控制。

解决方案:在 callFunction 完成之前不要调用 getVariable

关于ios - 为什么从闭包返回的变量总是落后一步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30879980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com