Thanks Quinn, I believe you are suggesting the following implementation. Please correct me if I am wrong.
@interface ThreadSafeArray()
@property (strong, nonatomic) NSMutableArray *data;
@end
@implementation ThreadSafeArray
(instancetype)init {
if (self = [super init]) {
}
return self;
}
(id)peek {
__block id result = nil;
dispatch_sync(queue, ^{ result = [self.data firstObject] });
return result;
}
(NSUInteger)length {
__block NSUInteger count = 0;
dispatch_sync(queue, ^{ result = [self.data count] });
return count;
}
(void)enqueue:(id)datum {
dispatch_async(queue, ^{
[NSLock lock];
[self.data addObject:datum] ;
[NSLock unlock];
});
}
@end
Can we barrier async instead of lock as shown below.
@interface ThreadSafeArray()
@property (strong, nonatomic) NSMutableArray *data;
@property (strong, nonatomic) dispatch_queue_t queue;
@end
@implementation ThreadSafeArray
(instancetype)init {
if (self = [super init]) {
queue = dispatch_queue_create("ThreadSafeArray", DISPATCH_QUEUE_CONCURRENT);
}
return self;
}
(id)peek {
__block id result = nil;
dispatch_sync(queue, ^{ result = [self.data firstObject] });
return result;
}
(NSUInteger)length {
__block NSUInteger count = 0;
dispatch_sync(queue, ^{ result = [self.data count] });
return count;
}
(void)enqueue:(id)datum {
dispatch_barrier_async(queue, ^{ [self.data addObject:datum] });
}
@end