iOS: add thread-safe handling for JSDispatcher

This commit is contained in:
pengfei.zhou 2023-05-09 11:52:13 +08:00 committed by jingpeng
parent 542f73e0fd
commit d92ce26248

View File

@ -22,10 +22,19 @@
@interface DoricJSDispatcher ()
@property(nonatomic, strong) NSMutableArray <DoricAsyncResult *(^)(void)> *blocks;
@property(nonatomic, assign) BOOL consuming;
@property(nonatomic, strong) dispatch_queue_t syncQueue;
@end
@implementation DoricJSDispatcher
- (instancetype)init {
if (self = [super init]) {
_syncQueue = dispatch_queue_create("DoricJSDispatcher", DISPATCH_QUEUE_CONCURRENT);
}
return self;
}
- (void)dispatch:(DoricAsyncResult *(^)(void))block {
dispatch_barrier_async(self.syncQueue, ^{
if (!self.blocks) {
self.blocks = [@[block] mutableCopy];
} else {
@ -37,9 +46,12 @@ - (void)dispatch:(DoricAsyncResult *(^)(void))block {
if (!self.consuming) {
[self consume];
}
});
}
- (void)consume {
dispatch_barrier_async(self.syncQueue, ^{
DoricAsyncResult *(^block )(void) = self.blocks.lastObject;
if (block) {
self.consuming = YES;
@ -55,9 +67,12 @@ - (void)consume {
} else {
self.consuming = NO;
}
});
}
- (void)clear {
dispatch_barrier_async(self.syncQueue, ^{
[self.blocks removeAllObjects];
});
}
@end