我应该何时使用前者,何时使用后者?他们看起来非常相似。
答案 0 :(得分:0)
Reading the source很容易看出他们的表现非常不同。
dispatch_queue_get_specific从您传入的特定队列中获取值/上下文:
DISPATCH_NOINLINE
void *
dispatch_queue_get_specific(dispatch_queue_t dq, const void *key)
{
if (slowpath(!key)) {
return NULL;
}
void *ctxt = NULL;
if (fastpath(dq->dq_specific_q)) {
ctxt = (void *)key;
dispatch_sync_f(dq->dq_specific_q, &ctxt, _dispatch_queue_get_specific);
}
return ctxt;
}
dispatch_get_specific从您当前的队列中获取值/上下文,然后向上查看您当前的队列集:
DISPATCH_NOINLINE
void *
dispatch_get_specific(const void *key)
{
if (slowpath(!key)) {
return NULL;
}
void *ctxt = NULL;
dispatch_queue_t dq = _dispatch_queue_get_current();
while (slowpath(dq)) {
if (slowpath(dq->dq_specific_q)) {
ctxt = (void *)key;
dispatch_sync_f(dq->dq_specific_q, &ctxt,
_dispatch_queue_get_specific);
if (ctxt) break;
}
dq = dq->do_targetq;
}
return ctxt;
}