iPhone加速度计:didAccelerate:在我运行循环时似乎没有被调用

时间:2010-04-22 04:21:35

标签: iphone uiaccelerometer iphone-sdk-3.1.2

与加速度计相关的问题。 (抱歉,格式化可能看起来不正确,这是我第一次使用这个网站)。我使用标准代码

让加速计按预期工作
UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = self;
accel.updateInterval = 0.1;   //I also tried other update values

每次加速度计: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

}

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

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

我错过了一些明显的东西吗?或者在进行某些处理时,加速度计方法是否会触发?

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

2 个答案:

答案 0 :(得分:2)

(请勿将float==进行比较。)

CPU被循环占用,没有时间为您提供更新的加速器值。

由于每次加速度变化都会调用-accelerometer:didAccelerate:,为什么不只使用if

// in -accelerometer:didAccelerate:
if (fabs(nextAccelValue - firstAccelValue) < 0.0001) {
   // do something
   nextAccelValue = globalAccel;
}

答案 1 :(得分:0)

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

实际上,我想要做的是:按下按钮后,我想获取加速度计值(firstValue),然后等到它改变(比如说相对于firstValue的特定值),然后继续做一些任务。因此我使用了while循环。 (我显示的循环只是等待它改变,但是一旦它工作,我可以把所需的确切变化条件。)

从你的回答中,我知道我可以在-accelerometer中执行任务:didAccelerate:function本身(因为它可以访问它需要的所有数据,我可以让它访问一个指示是否按下按钮的变量) 。非常感谢。我想我可以这样做。

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

再次感谢!