iOS: add thread-safe handling for JSDispatcher
This commit is contained in:
parent
542f73e0fd
commit
d92ce26248
@ -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
|
||||
|
Reference in New Issue
Block a user