dispatch_queue_get_specific和dispatch_get_specific之间的区别是什么?

时间:2016-06-20 18:06:20

标签: grand-central-dispatch

我应该何时使用前者,何时使用后者?他们看起来非常相似。

1 个答案:

答案 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;
}