2017-01-13 70 views
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循環的粉絲)非常低效的方式,但我有來了麻煩以更好的方式。

+1

該設備相當「愚蠢」。它可以接受一個方向性指令,但不能移動到絕對位置,因此它實際上並不知道它何時到達目的地。爲了清晰起見,我編輯了這個問題。 –

回答

0

我最終使用定時器來定期監視設備的位置,這比使用while循環好得多。

相關問題