美文网首页
第46条:不要使用dispatch_get_current_qu

第46条:不要使用dispatch_get_current_qu

作者: MrSYLong | 来源:发表于2018-10-14 21:59 被阅读6次

    在使用GCD时,经常需要判断当前代码正在那个队列上执行,GCD中有:

    dispatch_get_current_queue()
    

    但iOS系统从6.0版本起就正式弃用此函数,只应做调用之用。此函数的行为常常与开发者所预期的不同。

    队列之间会形成一套层级体系,这意味着在某个队列中的块,会在其上级队列(也就是父队列)里执行。这样也导致无法单用某个队列对象来描述“当前队列”这一概念。层级里地位最高的那个队列总是“全局并发队列”。

    想要解决需要知道当前队列才可以解决的死锁问题,通常也可以改用“队列特定数据”来解决。

    dispatch_queue_t queueA = dispatch_queue_create("com.effectiveobjectivec.queueA", NULL);
    dispatch_queue_t queueB = dispatch_queue_create("com.effectiveobjectivec.queueB", NULL);
    // 设置两个队列的优先级为一样的
    dispatch_set_target_queue(queueB, queueA);
    
    static int kQueueSpecific;
    CFStringRef queueSpecificValue = CFSTR("queueA");
    // 队列A上设置“队列特定值” 参数:待设置数据队列、键(void指针)、值(void指针)、析构函数(对值进行内存管理)
    dispatch_queue_set_specific(queueA, &kQueueSpecific, (void*)queueSpecificValue, (dispatch_function_t)CFRelease);
    
    dispatch_sync(queueB, ^{
        dispatch_block_t block = ^{
            NSLog(@"no deadlock");
        };
        CFStringRef retrievedValue = dispatch_get_specific(&kQueueSpecific);
        if (retrievedValue) {
            block();
        } else {
            dispatch_sync(queueA, block);
        }
    });
    

    相关文章

      网友评论

          本文标题:第46条:不要使用dispatch_get_current_qu

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