美文网首页Fuck iOS EveryDay
dispatch_queue_set_specific、disp

dispatch_queue_set_specific、disp

作者: 海文_L | 来源:发表于2018-12-17 18:39 被阅读7次

    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");
    }
    

    相关文章

      网友评论

        本文标题:dispatch_queue_set_specific、disp

        本文链接:https://www.haomeiwen.com/subject/apickqtx.html