1

加速度计相关问题。(对不起,格式可能看起来不对,这是我第一次使用这个网站)。我使用标准代码让加速度计按预期工作

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = self;
accel.updateInterval = 0.1;   //I also tried other update values

每次调用我的类中的 accelerometer:didAccelerate: 方法时,我都会使用 NSLog 来记录。该函数按预期调用,直到这里一切正常。

但是,当我运行循环时,似乎没有调用上述方法。像这样的东西

float firstAccelValue = globalAccel; //this is the x-accel value (stored in a global by the above method)
float nextAccelValue = firstAccelValue;

while (nextAccelValue == firstAccelValue){

    //do something
    nextAccelValue = globalAccel; // note globalAccel is updated by the accelerometer method

}

上述循环永远不会退出,因为 accelerometer:didAccelerate: 方法没有被调用,因此 globalAccel 永远不会改变值。

如果我使用固定条件来中断 while 循环,我可以看到循环结束后,方法调用再次正常工作。

我在这里遗漏了一些明显的东西吗?还是在完成某些处理时加速度计方法不会触发?

任何帮助将不胜感激!谢谢!

4

2 回答 2

2

(不要比较float==

CPU 被循环占用,没有时间给你更新的加速器值。

既然-accelerometer:didAccelerate:每次加速度变化时都会被调用,为什么不直接使用if呢?

// in -accelerometer:didAccelerate:
if (fabs(nextAccelValue - firstAccelValue) < 0.0001) {
   // do something
   nextAccelValue = globalAccel;
}
于 2010-04-22T06:00:27.850 回答
0

非常感谢!(关于浮动比较,是的,我明白,这只是一个例子)。

实际上,我想做的是:按下按钮后,我想获取加速度计值(firstValue),然后等到它发生变化(说相对于firstValue的特定值),然后继续执行一些任务。因此,我正在使用 while 循环。(我展示的循环只是等到它发生变化,但我可以在它工作后放置所需的确切变化条件)。

从您的回答中,我了解到我可以在 -accelerometer:didAccelerate: 函数本身中执行任务(因为它可以访问它需要的所有数据,我可以让它访问一个指示按钮是否被按下的变量)。非常感谢。我想我可以让它以这种方式工作。

但只是好奇 - 有没有办法做到这一点?如果过多的处理占用了 CPU,我可以强制它以某种方式更新加速度计吗?占用 CPU 本身的循环是低优先级的,因为它只是我等待值更改的方式。

再次感谢!

于 2010-04-22T19:55:02.453 回答