与加速度计有关的问题。 (抱歉,格式可能看起来不正确,这是我第一次使用此网站)。我使用标准代码获得了预期的加速度计

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本身的循环本身是较低的优先级,因为这只是我等到值变化的方式。

再次感谢!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top