带你系统学习GCD(二)

欢迎走进夏天的Coding世界.
1. dispatch_barrier_async

下面通过代码对他进行解释

    dispatch_queue_t queue = dispatch_queue_create("queue.example", DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(queue, ^{
        NSLog(@"-------------------1");
    });

    dispatch_async(queue, ^{
        NSLog(@"-------------------2");
    });

    dispatch_async(queue, ^{
        NSLog(@"-------------------3");
    });

    dispatch_async(queue, ^{
        NSLog(@"-------------------4");
    });


        // dispatch_barrier_async(queue, ^{
        // NSLog(@"I am a barrier");
        // });


    dispatch_async(queue, ^{
        NSLog(@"-------------------5");
    });

    dispatch_async(queue, ^{
        NSLog(@"-------------------6");
    });

    dispatch_async(queue, ^{
        NSLog(@"-------------------7");
    });

    dispatch_async(queue, ^{
        NSLog(@"-------------------8");
    });

在开发的过程中某些功能实现的时候, 我们可能需要一些特定的表现形式, 比如我想让 在 1234 都执行结束之后, 在执行之后的操作(5678), 这样使用 dispatch_barrier_async 就可以实现了, 当然使用上篇文章说到的group和dispatch_set_target_queue(不太常用)结合使用也可实现, 但是源码会很复杂, 不推荐.

2. dispatch_sync

dispatch_sync函数 “async” 异步即非同步, sync即是同步.

假设一种场景: 在执行Main Dispatch Queue 时, 使用另外一种线程 Global Dispatch Queue 进行处理, 处理结束后立即使用所得到的结果 代码示例如下

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_sync(queue, ^{
        //
    });

sync 容易造成死锁情况. 下面列举几个
情景1

dispatch_queue_t queue2 = dispatch_get_main_queue();
    dispatch_sync(queue2, ^{
        //
        NSLog(@"----------"); // 不会被执行
    });

情景2

    dispatch_queue_t queue3 = dispatch_get_main_queue();
    dispatch_async(queue3, ^{
        //
        dispatch_sync(queue3, ^{
            NSLog(@"----------");
        });
    });

情景3

    dispatch_queue_t queue4 = dispatch_queue_create("queue.example", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue4, ^{
        //
        dispatch_sync(queue4, ^{
            //
            NSLog(@"---------");
        });
    });
3. dispatch_apply

dispatch_apply 是 dispatch_sync 和 Dispatch Group 的关联API.
重复执行Block中代码. 示例如下

dispatch_queue_t queue5 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_apply(5, queue5, ^(size_t i) {
        NSLog(@"i= %zu", i);
    });

其实Dispatch_apply函数与Dispatch_sync函数相同, 都是会等待处理执行结束所以推荐这样使用示例代码如下

    dispatch_queue_t queue6 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    // 在Global Dispatch Queue 中非同步执行

    dispatch_async(queue6, ^{
        // Global Dispatch Queue 等待 Dispatch_apply 函数中的全部处理执行结束
        dispatch_apply(5, queue6, ^(size_t index) {
            //
            NSLog(@"i = %zu", index);
        });

        // 在Dispatch_apply 函数中的处理全部执行结束
        // 在Main Dispatch Queue 中非同步执行

        dispatch_async(dispatch_get_main_queue(), ^{
            // 用户界面更新等
            NSLog(@" end ");
        });
    });

原文链接

你可能感兴趣的:(ios,oc,gcd)