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
。。。