1
我無法控制使用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循環的粉絲)非常低效的方式,但我有來了麻煩以更好的方式。
該設備相當「愚蠢」。它可以接受一個方向性指令,但不能移動到絕對位置,因此它實際上並不知道它何時到達目的地。爲了清晰起見,我編輯了這個問題。 –