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... ループによってブロックされているようです。Core Motion には、加速度CMMotionManagerを報告できるオブジェクト内の加速度計プロパティもあり、Nike+ が使用するものであるため、バックグラウンド処理が改善されます。これにアクセスするには、データを直接取得するプル メソッドとコールバックの 2 つの方法があります。正直なところ、私はそれを試してみただけで、コールバックを機能させることができませんでした (主に NSOperationQueue が必要であり、それについてあまり経験がないため、おそらく間違ったキューに入れている可能性があります)。あなたのアプローチが必要と思われるデータを引っ張っても大丈夫なら、これはうまくいきます:

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

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

デバイスで試してみたところ、 for... ループで報告された値が現在の加速度で更新されました。

ソース: UIBackgroundModes と UIAccelerometer

于 2013-03-30T16:17:08.840 に答える