欢迎走进夏天的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 ");
});
});
时间: 2024-12-26 02:06:40