在dispatch_queue_t上检查是否相等

时间:2012-09-26 16:20:52

标签: cocoa-touch cocoa grand-central-dispatch nsthread

如何检查dispatch_queue_t变量之间的相等性?

dispatch_queue_t currentQueue = dispatch_get_current_queue();
dispatch_queue_t mainQueue = dispatch_get_main_queue();
if (currentQueue == mainQueue) {

}

来自文档:

typedef struct dispatch_queue_s *dispatch_queue_t;

我不确定但这是否意味着它是指向dispatch_queue_s结构的指针?

由于我无法检查指针上的相等性,我不知道如何检查dispatch_queue_t是否与另一个相同?

3 个答案:

答案 0 :(得分:23)

由于不推荐使用 dispatch_get_current_queue(),我们可以按标签比较当前和您的队列(或者@jkh建议的详细信息)

用于标签使用

dispatch_queue_get_label(dispatch_queue_t queue);

并传递DISPATCH_CURRENT_QUEUE_LABEL以获取当前队列的标签

具体:

dispatch_queue_get_specific(dispatch_queue_t queue, const void *key);

让你排队特定和

dispatch_get_specific(const void *key);

目前

需要为您的队列设置标签和特定标签中的一个或两个。 例如,当你创建它时

dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);

或使用特定的

的setter
dispatch_queue_set_specific(dispatch_queue_t queue, const void *key,
    void *context, dispatch_function_t destructor);

答案 1 :(得分:2)

答案的第一部分:你想做什么?你为什么需要比较队列?如果您需要做的只是“标记”具有某些特定元数据的队列,请考虑使用dispatch_queue_ {set,get} _specific()代替。

答案的第二部分:不要使用dispatch_get_current_queue(),以及任何东西。它仅用于调试目的,并且一直不鼓励使用它。

答案 2 :(得分:1)

这取决于您所在的队列。在这种特殊情况下使用:

if ([NSThread isMainThread]) {}

通常,您可以使用dispatch_get_current_queue()来测试您所在的队列。在这种情况下,您可以使用==运算符来执行此操作。引用Apple的并发编程指南中的Dispatch Queues页面:

  

使用dispatch_get_current_queue函数进行调试或   测试当前队列的标识。从中调用此函数   块对象内部返回块所在的队列   提交(并且现在可能正在运行)。打电话给这个   来自块外部的函数返回默认的并发队列   为您的申请。