如何控制UISlider Value Changed-events frequncy?

我正在写一个iPhone应用程序,使用两个uisliders来控制使用coreBluetooth发送的值。 如果我快速移动滑块,一个值会在接收器处冻结,大概是因为Value Changed事件经常触发,所以写入命令堆积起来并最终被扔掉。 我怎样才能确保事件不会经常触发?

编辑:

这是对问题的澄清; 蓝牙连接每隔105ms发送一次命令。 如果用户在那段时间内产生了一堆事件,他们看起来就像是一团糟。 我想扔掉连接事件之间产生的任何值,并每隔105ms发送一次。

这基本上是我现在正在做的事情:

-(IBAction) sliderChanged:(UISlider *)sender{ static int8_t value = 0; int8_t new_value = (int8_t)sender.value; if ( new_value > value + threshold || new_value < value - threshold ) { value = new_value; [btDevice writeValue:value]; } } 

我问的是如何实现类似的东西

 -(IBAction) sliderChanged:(UISlider *)sender{ static int8_t value = 0; if (105msHasPassed) { int8_t new_value = (int8_t)sender.value; if ( new_value > value + threshold || new_value < value - threshold ) { value = new_value; [btDevice writeValue:value]; } } } 

我想这是有道理的,仍然触发他们…我会做你的情况,将是检查当前值和以前的值之间的增量。 例如:

  • 当前值 – > 5。
  • 下一个值 – > 6。
  • 三angular洲1

只是一些伪代码:

 if(delta>5){ //do your stuff } 

我不会这样做,但是:

 -(void)sliderValueChanged:(UISlider *)sender{ [self performSelector:@selector(removeAction:) withObject:sender afterDelay:0.3]; // Do your stuff } - (void)removeAction:(UISlider *)sender{ [sender removeTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged]; [self performSelector:@selector(addAction:) withObject:sender afterDelay:0.3]; } - (void)addAction:(UISlider *)sender{ [mySlider addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged]; } 

我没有testing过这个,但我想你明白了。

您可能会变得复杂,并根据某个时间戳或新值与旧值之间的差值是否大于某个阈值来过滤来自滑块的input。

更简单的方法是使用不同的事件:touchEnded。 这样你只发送一个最终值,而不是所有的中间值。

可能不适合您的应用程序,但不完全清楚您需要做什么。

只是一个想法,但你可以做的是不发送价值改变的事件。 您可以将最后一次传输的值存储在variables中,然后您可以在后台运行一个计时器,以检查发送的最后一个值是否与当前滑动值不同,如果发送了新值。 定时器可以设置为每105ms触发一次,如果新值与上次发送的值不同,则每隔105ms只发送一次。