之前分享了可以用dispatch_queue_set_specificdispatch_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;
}

主队列的labelcom.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值。

参考

  1. Get current dispatch queue?