带你系统学习GCD(二)

来源:互联网 发布:淘宝东西会自动下架吗 编辑:程序博客网 时间:2024/06/06 19:30
欢迎走进夏天的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 ");        });    });

原文链接

4 0
原创粉丝点击