监控和控制具有延迟反馈的设备的正确方法是什么?

时间:2017-01-13 00:44:43

标签: swift asynchronous

我无法使用UISlider控制真实设备的位置。设备接受方向命令(缩回或扩展),但不接受绝对位置的命令。它在查询时报告其当前位置。

例如,如果设备位于位置50并且我使用UISlider将所需位置设置为25,则程序命令设备朝向25的方向前进。可能需要几秒钟,因此我反复查询它,并且一旦达到25,我命令设备停止。我当前的(未经测试的)代码如下所示:

    func sliderMoved(_ label : UILabel, openCharacteristicNum : Int, closeCharacteristicNum : Int, sender: UISlider){
        let actuatorPosition = getActuatorPosition(label)

        // run this on a background thread
        DispatchQueue.global(qos: .background).async {
            if (actuatorPosition > sender.value) {
                // stop closing and start opening
                self.writeValue(closeCharacteristicNum, value: 1)
                self.writeValue(openCharacteristicNum, value: 0)
                while actuatorPosition > sender.value {
                    actuatorPosition = getActuatorPosition(label)
                }
                // stop opening
                self.writeValue(openCharacteristicNum, value: 1)
            }
            else if (actuatorPosition < sender.value) {
                // stop opening and start closing
                self.writeValue(openCharacteristicNum, value: 1)
                self.writeValue(closeCharacteristicNum, value: 0)
                while actuatorPosition < sender.value {
                    actuatorPosition = getActuatorPosition(label)
                }
                // stop closing
                self.writeValue(closeCharacteristicNum, value: 1)
            }
        }

    }

这感觉是解决问题的一种非常低效的方式(我不是用while循环阻止线程的粉丝)但是我在找到更好的方法时遇到了麻烦。

1 个答案:

答案 0 :(得分:0)

我最终使用计时器来定期监控设备的位置,这比使用while循环要好得多。