2017-04-05 8 views
0

私は、0.01秒の間隔でジャイロと加速度計モーションアップデートの両方を受信するシリアルキューを持っています。 はスレッドセーフではありません。また、両方のブロックで配列を変更しても、この方法で配列を操作するのは安全ですか?シリアルキューを持つCMMotionManager

シリアルキューのタスクは一度に1つずつ実行されますが、2つの動作のうちの1つだけが監視されている場合は、アレイを変更しても安全ですか?

@implementation NSThread (GetSequenceNumber) 

- (NSInteger)number 
{ 
    return [[self valueForKeyPath:@"private.seqNum"] integerValue]; 
} 

@end 

@interface SensorCollector() 

@property (nonatomic, strong) NSMutableArray *array; 

@end 

@implementation SensorCollector 
- (id)init { 
    if (self = [super init]) { 
     self.motionManager = [CMMotionManager new]; 
     self.queue = [[NSOperationQueue alloc] init]; 
     self.queue.maxConcurrentOperationCount = 1; 
     _array = [NSMutableArray array]; 
    } 
    return self; 
} 

- (void)starCollect { 
    float updateInterval = 0.01;//50Hz 

    //setup sensors callback in background NSOperationQueue 
    if ([self.motionManager isAccelerometerAvailable]) { 
     [self.motionManager setAccelerometerUpdateInterval:updateInterval]; 
     [self.motionManager startAccelerometerUpdatesToQueue:self.queue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { 
      //modify self.array here 
      NSLog(@"Acce %ld", [NSThread currentThread].number); 
     }]; 
    } 

    if ([self.motionManager isGyroAvailable]) { 
     [self.motionManager setGyroUpdateInterval:updateInterval]; 
     [self.motionManager startGyroUpdatesToQueue:self.queue withHandler:^(CMGyroData *gyroData, NSError *error) { 
      //also modify self.array here 
      NSLog(@"Gyro %ld", [NSThread currentThread].number); 
     }]; 
    } 

} 

答えて

1

はい、安全です。 maxConcurrentOperationCount = 1を設定したため、ハンドラブロックはNSOperationQueueで順番に実行されます。

あなたが二重に確認したい場合は、それを変更するとき、あなたは@synchronizedブロック内で操作を行うことで、配列をロックすることができは:

@synchronized(self.array) { 
    // Modify self.array here... 
} 

私はこれが必要だとは思わない、と述べました。

+0

答えていただきありがとうございます。「@同期」はちょっと高価です。 – gabbler

関連する問題