判断是否在主队列运行
在iOS中,如果我们要判断代码是否运行在主线程,可以直接使用NSThread.isMainThread()
方法。但如果要判断是否运行在主队列(main queue)呢?
需要注意的是,每个应用都只有一个主线程,但主线程中可能有多个队列,则不仅仅只有主队列,所以NSThread.isMainThread()
方法并没有办法判断是否是在主队列运行。而GCD也没有提供相应的方法。那该如何处理呢?
来看看React Native的处理方式:
BOOL RCTIsMainQueue()
{
static void *mainQueueKey = &mainQueueKey;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dispatch_queue_set_specific(dispatch_get_main_queue(),
mainQueueKey, mainQueueKey, NULL);
});
return dispatch_get_specific(mainQueueKey) == mainQueueKey;
}
可以看到这里使用了dispatch_queue_set_specific
和dispatch_get_specific
。实际上是通过dispatch_queue_set_specific
方法给主队列(main queue)关联了一个key-value对,再通过dispatch_get_specific
从当前队列中取出mainQueueKey
对应的value。如果是主队列,取出来的值就是写入的值,如果是其它主队列,取出的值就是另一个值或者是NULL。这样就OK了。
当然,同样可以用类似的方式来设置其它的队列(设置全局并发队列无效)。