与加速度计相关的问题。 (抱歉,格式化可能看起来不正确,这是我第一次使用这个网站)。我使用标准代码
让加速计按预期工作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循环,我可以看到循环结束后,方法调用再次正常工作。
我错过了一些明显的东西吗?或者在进行某些处理时,加速度计方法是否会触发?
任何帮助将不胜感激!谢谢!
答案 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本身的循环是低优先级的,因为它只是我等待直到值改变的方式。
再次感谢!