mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
101 lines
1.8 KiB
Objective-C
101 lines
1.8 KiB
Objective-C
|
|
|
|
#import "ASQueue.h"
|
|
|
|
@interface ASQueue ()
|
|
{
|
|
bool _isMainQueue;
|
|
dispatch_queue_t _queue;
|
|
|
|
const char *_name;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation ASQueue
|
|
|
|
- (instancetype)initWithName:(const char *)name
|
|
{
|
|
self = [super init];
|
|
if (self != nil)
|
|
{
|
|
_name = name;
|
|
|
|
_queue = dispatch_queue_create(_name, 0);
|
|
dispatch_queue_set_specific(_queue, _name, (void *)_name, NULL);
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
#if !OS_OBJECT_HAVE_OBJC_SUPPORT
|
|
dispatch_release(_queue);
|
|
#endif
|
|
_queue = nil;
|
|
}
|
|
|
|
+ (ASQueue *)mainQueue
|
|
{
|
|
static ASQueue *queue = nil;
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^
|
|
{
|
|
queue = [[ASQueue alloc] init];
|
|
queue->_queue = dispatch_get_main_queue();
|
|
queue->_isMainQueue = true;
|
|
});
|
|
return queue;
|
|
}
|
|
|
|
- (dispatch_queue_t)nativeQueue
|
|
{
|
|
return _queue;
|
|
}
|
|
|
|
- (bool)isCurrentQueue
|
|
{
|
|
if (_queue == nil)
|
|
return false;
|
|
|
|
if (_isMainQueue)
|
|
return [NSThread isMainThread];
|
|
else
|
|
return dispatch_get_specific(_name) == _name;
|
|
}
|
|
|
|
- (void)dispatchOnQueue:(dispatch_block_t)block
|
|
{
|
|
[self dispatchOnQueue:block synchronous:false];
|
|
}
|
|
|
|
- (void)dispatchOnQueue:(dispatch_block_t)block synchronous:(bool)synchronous
|
|
{
|
|
if (block == nil)
|
|
return;
|
|
|
|
if (_queue != nil)
|
|
{
|
|
if (_isMainQueue)
|
|
{
|
|
if ([NSThread isMainThread])
|
|
block();
|
|
else if (synchronous)
|
|
dispatch_sync(_queue, block);
|
|
else
|
|
dispatch_async(_queue, block);
|
|
}
|
|
else
|
|
{
|
|
if (dispatch_get_specific(_name) == _name)
|
|
block();
|
|
else if (synchronous)
|
|
dispatch_sync(_queue, block);
|
|
else
|
|
dispatch_async(_queue, block);
|
|
}
|
|
}
|
|
}
|
|
|
|
@end
|