iPhone加速度计:Didaccelerate:我在运行循环时似乎没有被打电话
-
30-09-2019 - |
题
与加速度计有关的问题。 (抱歉,格式可能看起来不正确,这是我第一次使用此网站)。我使用标准代码获得了预期的加速度计
UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = self;
accel.updateInterval = 0.1; //I also tried other update values
我每次加速度计:didaccelerate:我的班级中的方法都被调用。该功能按预期调用,一切正常,直到这里为止。
但是,当我运行循环时,上述方法似乎没有被调用。这样的东西
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永远不会改变价值。
如果我使用固定条件破坏WARE循环,我可以看到循环结束后,该方法调用再次工作正常。
我在这里错过了明显的东西吗?还是加速度计进行某些处理后未开火?
任何帮助将不胜感激!谢谢!
没有正确的解决方案
其他提示
(不要比较 float
和 ==
.)
CPU被循环占据,没有时间为您提供更新的加速器值。
自从 -accelerometer:didAccelerate:
每次加速都会变化,为什么不使用 if
?
// in -accelerometer:didAccelerate:
if (fabs(nextAccelValue - firstAccelValue) < 0.0001) {
// do something
nextAccelValue = globalAccel;
}
非常感谢! (关于浮点比较,是的,我明白,这只是一个例子)。
实际上,我要做的是:按下按钮后,我想获得加速度计值(FirstValue),然后等待直到更改(相对于FirstValue说特定值),然后继续执行一些任务。因此,我正在使用时循环。 (我显示的循环只需等到它更改,但是我可以在工作后需要确切的更改条件)。
从您的答案中,我了解我可以在-accelerometer:didaccelerate:函数本身中执行任务(由于它可以访问所需的所有数据,因此我可以使其访问一个变量,以指示是否按下按钮)。非常感谢。我想我可以通过这种方式使其正常工作。
但是只是好奇 - 有没有办法这样做?如果处理过多的处理CPU,我可以强迫它以某种方式更新加速度计吗? CPU本身的循环本身是较低的优先级,因为这只是我等到值变化的方式。
再次感谢!