Fuck iOS EveryDay

dispatch_queue_set_specific、disp

2018-12-17  本文已影响7人  海文_L

dispatch_queue_set_specific在文档中的解释是“使用此方法将自定义的上下文与队列关联,运行中的队列可用dispatch_get_specific检索。”

dispatch_queue_get_specific 是获取指定调度队列的上下文键/值数据。

dispatch_get_specific是获取当前调度队列的上下文键/值数据。

举个例说明下:

    const void * queueKey = "queueKey";
    const void * queueKey2 = "queueKey2";
    dispatch_queue_t queue = dispatch_queue_create(queueKey, NULL);
    dispatch_queue_t queue2 = dispatch_queue_create(queueKey2, NULL);
    
    //调用此方法会触发queueFunction函数,留个疑问queueFunction是在什么时候触发?
    dispatch_queue_set_specific(queue, queueKey, &queueKey, queueFunction);
    dispatch_queue_set_specific(queue2, queueKey2, &queueKey2, NULL);
    
    dispatch_sync(queue, ^{
        go();
    });
    dispatch_sync(queue2, ^{
        go();
    });
    
    if (dispatch_queue_get_specific(queue, queueKey)) {
        NSLog(@"__run in queue");
    }

    //main queue中找不到queueKey,所以这段Log不会触发,使用dispatch_get_specific(queueKey)的原理也一样
    if (dispatch_queue_get_specific(dispatch_get_main_queue(), queueKey)) {
        NSLog(@"__run in main queue");
    }
    if (dispatch_get_specific(queueKey)) {
        NSLog(@"__run in main queue");
    }
void go() {
    //使用dispatch_sync改变了当前的执行队列,所以这里可以检索到queueKey
    if(dispatch_get_specific("queueKey")) {
        NSLog(@"queue");
    } else if(dispatch_get_specific("queueKey2")) {
        NSLog(@"queue2");
    } else {
        NSLog(@"main queue");
    }
}

void queueFunction() {
    NSLog(@"__queueFunction");
}
上一篇 下一篇

猜你喜欢

热点阅读