[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 にブレーク ポイントを配置してもトリガーされません。