5

我正在编写一个 iPhone 应用程序,它使用两个 uislider 来控制使用 coreBluetooth 发送的值。如果我快速移动滑块,一个值会在接收器处冻结,大概是因为 Value Changed 事件触发得太频繁以至于写入命令堆积起来并最终被丢弃。如何确保事件不会频繁触发?

编辑:

这是对问题的澄清;蓝牙连接每 105 毫秒发送一次命令。如果用户在那段时间产生了一堆事件,他们似乎在排队。我想丢弃连接事件之间生成的任何值,并且每 105 毫秒发送一个。

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

-(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];
    }
  }
}
4

3 回答 3

0

我想仍然触发它们确实有意义......在你的情况下我会做的是检查当前值和先前值之间的增量。例如:

  • 当前值 -> 5。
  • 下一个值 -> 6。
  • 三角洲 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];   
}

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

于 2012-07-04T07:38:04.503 回答
0

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

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

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

于 2012-07-04T07:48:42.100 回答
0

只是一个想法,但您可以做的不是发送值更改事件。您可以将上次传输的值存储在一个变量中,然后您可以在后台运行一个计时器,检查发送的最后一个值是否与当前滑块值不同,如果是则发送新值。计时器可以设置为每 105 毫秒触发一次,如果新值与上次发送的值不同,它只会每 105 毫秒发送一次值。

于 2012-07-04T09:13:11.180 回答