新しいCoreMotionフレームワークを使用して、一部のハードウェアデバイスを監視しています。これを行うための一般的なコードは次のとおりです。
-(void)startAccelerometer{
self.motion.accelerometerUpdateInterval = 1/30.0f;
NSOperationQueue* accelerometerQueue = [[NSOperationQueue alloc] init];
CMAccelerometerHandler accelerometerHandler = ^(CMAccelerometerData *accelerometerData, NSError *error) {
NSLog(@"Accelerometer realtime values");
NSLog(@"x=%f", accelerometerData.acceleration.x);
NSLog(@"y=%f", accelerometerData.acceleration.y);
NSLog(@"z=%f", accelerometerData.acceleration.z);
NSLog(@" ");
};
[self.motion startAccelerometerUpdatesToQueue:accelerometerQueue withHandler:[[accelerometerHandler copy]autorelease]];
}
それはうまくいきます。ここで、UILabelに値を出力したいのですが、CoreMotionフレームワークではブロックを使用するため、これがメインキューにあるとは限りません(実際、私のアプリではそうではありません)。このようにメインキューでラベルのセッターを実行するのは「間違っている」のでしょうか。
-(void)startAccelerometer{
self.motion.accelerometerUpdateInterval = 1/30.0f;
NSOperationQueue* accelerometerQueue = [[NSOperationQueue alloc] init];
CMAccelerometerHandler accelerometerHandler = ^(CMAccelerometerData *accelerometerData, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
self.lblAccelerometer.text = [NSString stringWithFormat:@"Accelerometer:\nx = %f\ny = %f\nz = %f",
accelerometerData.acceleration.x,
accelerometerData.acceleration.y,
accelerometerData.acceleration.z];
});
};
[self.motion startAccelerometerUpdatesToQueue:accelerometerQueue withHandler:[[accelerometerHandler copy]autorelease]];
}
それはうまく機能し、これが眉をひそめる理由は私にはわかりません。それについて何か考えはありますか?