From b14f28c089c46ca60a88071c02a06152e5a32007 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 5 Feb 2015 18:24:35 +0300 Subject: [PATCH] SQueue updates --- SSignalKit.xcodeproj/project.pbxproj | 1 + SSignalKit/SQueue.h | 4 ++ SSignalKit/SQueue.m | 61 +++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/SSignalKit.xcodeproj/project.pbxproj b/SSignalKit.xcodeproj/project.pbxproj index 95bf6088bd..9c587bcdf0 100644 --- a/SSignalKit.xcodeproj/project.pbxproj +++ b/SSignalKit.xcodeproj/project.pbxproj @@ -671,6 +671,7 @@ "DEBUG=1", "$(inherited)", ); + ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; diff --git a/SSignalKit/SQueue.h b/SSignalKit/SQueue.h index 3e7ad59974..85ac709ba6 100644 --- a/SSignalKit/SQueue.h +++ b/SSignalKit/SQueue.h @@ -2,6 +2,10 @@ @interface SQueue : NSObject ++ (SQueue *)mainQueue; ++ (SQueue *)concurrentDefaultQueue; ++ (SQueue *)concurrentBackgroundQueue; + - (void)dispatch:(dispatch_block_t)block; - (dispatch_queue_t)_dispatch_queue; diff --git a/SSignalKit/SQueue.m b/SSignalKit/SQueue.m index 0da661a5ec..80e24dd5b5 100644 --- a/SSignalKit/SQueue.m +++ b/SSignalKit/SQueue.m @@ -1,20 +1,69 @@ #import "SQueue.h" +static const void *SQueueSpecificKey = &SQueueSpecificKey; + @interface SQueue () { dispatch_queue_t _queue; + void *_queueSpecific; + bool _specialIsMainQueue; } @end @implementation SQueue ++ (SQueue *)mainQueue +{ + static SQueue *queue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^ + { + queue = [[SQueue alloc] initWithNativeQueue:dispatch_get_main_queue() queueSpecific:NULL]; + queue->_specialIsMainQueue = true; + }); + + return queue; +} + ++ (SQueue *)concurrentDefaultQueue +{ + static SQueue *queue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^ + { + queue = [[SQueue alloc] initWithNativeQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) queueSpecific:NULL]; + }); + + return queue; +} + ++ (SQueue *)concurrentBackgroundQueue +{ + static SQueue *queue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^ + { + queue = [[SQueue alloc] initWithNativeQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0) queueSpecific:NULL]; + }); + + return queue; +} + - (instancetype)init +{ + dispatch_queue_t queue = dispatch_queue_create(NULL, NULL); + dispatch_queue_set_specific(queue, SQueueSpecificKey, (__bridge void *)self, NULL); + return [self initWithNativeQueue:queue queueSpecific:(__bridge void *)self]; +} + +- (instancetype)initWithNativeQueue:(dispatch_queue_t)queue queueSpecific:(void *)queueSpecific { self = [super init]; if (self != nil) { - _queue = dispatch_queue_create(NULL, NULL); + _queue = queue; + _queueSpecific = queueSpecific; } return self; } @@ -29,4 +78,14 @@ dispatch_async(_queue, block); } +- (void)dispatchSync:(dispatch_block_t)block +{ + if (_queueSpecific != NULL && dispatch_get_specific(SQueueSpecificKey) == _queueSpecific) + block(); + else if (_specialIsMainQueue && [NSThread isMainThread]) + block(); + else + dispatch_sync(_queue, block); +} + @end