在......循环中加速

时间:2013-03-30 15:43:06

标签: iphone objective-c accelerometer

我有一个for ....循环,然后在循环中阻止UI。 加速度计是否也被阻挡了?

我在viewDidLoad

中有以下代码
- (void)viewDidLoad{
    [super viewDidLoad];
    UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
    accel.delegate = self;
    accel.updateInterval = 1.0f/60.0f;
 }

并进一步向下

- (void)accelerometer:(UIAccelerometer *)acel didAccelerate:(UIAcceleration *)acceleration {
    acc=acceleration.x;
}

然后IBAction连接到一个启动循环的按钮

- (IBAction)doSomething {
    for (int n = 1; n<=100;n++) {
        // do someting in the loop
        NSLog(@"x: %g", acc);
     }
 }

当记录加速度计x值时,它仅显示按下按钮时的第一个值,并且在循环运行时不会更新。相同的第一个值是连续重复的。 有没有办法在循环中记录加速度?

1 个答案:

答案 0 :(得分:2)

似乎UIAccelerometer需要主线程,因此被for ...循环阻止。 Core Motion在CMMotionManager对象中还具有加速度计属性,可以报告加速度,并且可以更好地进行背景,因为它是Nike +使用的。有两种方法可以访问它 - 一种直接获取数据的pull方法,或回调。说实话,我只是尝试了它并且无法使回调工作(主要是因为它需要NSOperationQueue并且我没有太多经验,所以我可能把它放在错误的队列中),但是如果你可以使用你的方法所需的数据,然后就可以了:

CMMotionManager *motionManager = [[CMMotionManager alloc] init];
[motionManager startAccelerometerUpdates];

for (int i = 0; i < 10000; i++)
{
    NSLog(@"Acceleration: %f", motionManager.accelerometerData.acceleration.x);
}

我只是在设备上尝试过,并且for ...循环中报告的值用当前加速度更新。

来源:UIBackgroundModes and UIAccelerometer