2

我有一个 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 值时,它仅在按下按钮时显示第一个值,并且在循环运行时不更新。相同的第一个值不断重复。有没有办法在循环中记录加速度?

4

1 回答 1

2

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

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

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

我刚刚在设备上尝试过,for...loop 中报告的值会随着当前加速度更新。

来源:UIBackgroundModes 和 UIAccelerometer

于 2013-03-30T16:17:08.840 回答