我有一个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值时,它仅显示按下按钮时的第一个值,并且在循环运行时不会更新。相同的第一个值是连续重复的。 有没有办法在循环中记录加速度?
答案 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 ...循环中报告的值用当前加速度更新。