我有一个串行队列,以0.01秒的间隔接收陀螺仪和加速度计运动更新。
从日志中我可以看到在不同的线程上执行了两个块,因为NSMutableArray
不是线程安全的,我也修改了两个块中的数组,这样操作数组是否安全?< / p>
我还读到串行队列上的任务一次执行一个,如果只监视两个动作中的一个,是否可以安全地修改数组?
@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);
}];
}
}
答案 0 :(得分:1)
是的,它应该是安全的。处理程序块将在NSOperationQueue
上按顺序执行,因为您已设置maxConcurrentOperationCount = 1
。
如果您想要倍加肯定,可以通过在@synchronized
块内执行操作来修改数组时锁定数组:
@synchronized(self.array) {
// Modify self.array here...
}
那就是说,我不认为这是必要的。