Cocoa touch 检查调度队列上的相等性

Cocoa touch 检查调度队列上的相等性,cocoa-touch,cocoa,grand-central-dispatch,nsthread,Cocoa Touch,Cocoa,Grand Central Dispatch,Nsthread,如何检查调度队列变量之间的相等性 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_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;
我不确定,但这是否意味着它是指向调度队列结构的指针


由于我无法检查指针是否相等,我不确定如何检查一个调度队列是否与另一个相同?

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

if ([NSThread isMainThread]) {}
通常,您可以使用
dispatch\u get\u current\u queue()
测试您所在的队列。在这种情况下,您可以使用
=
操作符来执行此操作。引用Apple并发编程指南中的调度队列页面:

使用dispatch_get_current_queue函数进行调试,或 测试当前队列的标识。从调用此函数 在块对象内部,返回块所属的队列 已提交(并且它现在可能正在运行)。叫这个 函数从块外部返回默认的并发队列 谢谢你的申请


回答的第一部分:你想做什么?为什么需要比较队列?如果您需要做的是用特定的元数据块来标记一个队列,那么考虑使用DexChyQueLeE{{SET,GET }指定()来代替。
答案的第二部分:不要对任何事情使用dispatch\u get\u current\u queue()。它只是为了调试目的,一直不鼓励使用它。

因为dispatch\u get\u current\u 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);

这句话确实表明,您可以使用
dispatch\u get\u current\u queue
“测试当前队列的标识”。问题是它只能在已调度的块中按预期工作。这就是为什么在iOS 6.0头文件中(
dispatch\u get\u current\u queue()
被标记为不推荐使用的(尽管奇怪的是在Mountain Lion头文件中没有)?我曾在包装器函数中使用它在串行队列上同步运行一个块,但如果该函数恰好是从该队列本身调用的,则不会死锁。我假设我们可以使用它来检查调用函数的调度队列的标识。我认为这不是一种安全的做法?一般来说,这不是一种安全的做法,因为队列a可以同步调度到队列B,然后队列B可以尝试调度回队列a,而这种方法不会检测到死锁。这是一个巨大的帮助。创建队列时,我使用了带有简单布尔标志的
dispatch\u queue\u set\u specific
,并使用
dispatch\u get\u specific
查看是否设置了该标志。工作起来很有魅力。使用其中一种(标签或特定)是否有好处?@Alfiehansen不确定100%,但认为没有太大的性能差异,可以使用对你来说非常方便的东西。我不知道
DISPATCH\u CURRENT\u QUEUE\u LABEL
,文档中没有提到。事实上,文档中说
队列
不能为
NULL
,但头文件中说
调度\u当前队列\u标签
队列
的有效参数,并将其定义为
NULL
。。。