1

[NSOperationQueue waitUntilAllOperationsAreFinished] を呼び出すコードがあります。このキューには、加速度計用のセンサー検出器が配置されています。

加速度計デリゲートは、didAccelerate に応答して収集されたデータを記録するために、メイン スレッドを必要とします。ただし、キューがメイン メソッドをブロックしているため、加速度計のデリゲートが起動しないようです。また、NSOperationQueue ブロックが発生した後にメイン スレッド (NSOBject performSelectorOnMainThread:withObject:waitUntilDone) で強制的に実行されるものも実行されないことに気付きました。

ブロッキングの発生を許可するが、加速度計デリゲートの発火を許可する別のオプションはありますか?

コードの簡単なスニペットを次に示します。

NSOperation* accelOp = [[AccelerometerOperation alloc] init];
NSOperationQueue* queue = [[NSOperationQueue alloc] init];
[queue addOperation:accelOP];
[queue waitUntilAllOperationsAreFinished];

また、AccelerometerOperation については、isFinished と isExecuting を変更することで、start メソッドが終了しても終了しないという問題を回避しました。

-(void) start{
    [[UIAccelerometer sharedAccelerometer] setDelegate:self];
}

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{
    NSLog(@"Did accelerate");
}

waitUntilALlOperationsAreFinished を削除すると、ログに「加速しました」と出力されます。ただし、waitUntilFinished が実行されていると、DidAccelerate にブレーク ポイントを配置してもトリガーされません。

4

0 に答える 0