判断代码在哪个队列中运行
之前分享了可以用dispatch_queue_set_specific
和dispatch_get_specific
来判断代码是否运行在主队列上。除了这种方法外,还可以使用dispatch_queue_get_label
获取当前队列的label
,与主队列的label
比较,如图代码所示:
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%d", [self isMainQueue]); // 1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"%d", [self isMainQueue]); // 0
});
}
- (BOOL)isMainQueue {
return strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(dispatch_get_main_queue())) == 0;
}
主队列的label
是com.apple.main-thread
。当然也可以用这种方式来判断其它队列。全局队列的label
与其QOS
类型相关,label
值主要有以下几个:
com.apple.root.user-interactive-qos //
com.apple.root.user-initiated-qos // DISPATCH_QUEUE_PRIORITY_HIGH
com.apple.root.default-qos // DISPATCH_QUEUE_PRIORITY_DEFAULT
com.apple.root.utility-qos // DISPATCH_QUEUE_PRIORITY_LOW
com.apple.root.background-qos // DISPATCH_QUEUE_PRIORITY_BACKGROUND
我们可以使用dispatch_get_global_queue(qos_class_self(), 0)
来获取代码所在的的全局队列,进而获取其label
值。
参考