内容简介:场景需求:需要异步完成三个任务。任务一、任务二、任务三。要求:任务三必须在任务一、任务二完成之后触发。这就需要使用dispatch_barrier_async。特点:像一堵围墙、成为任务的分割线。分析:任务一和任务二相互交错执行、由于珊栏函数存在、任务三最后执行。这三个任务都是异步完成、在各自的线程里。
场景需求:需要异步完成三个任务。任务一、任务二、任务三。要求:任务三必须在任务一、任务二完成之后触发。这就需要使用dispatch_barrier_async。
特点:像一堵围墙、成为任务的分割线。
代码如下:
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
//任务1
for (int i = 0; i < 2; i++) {
NSLog(@"我是任务一、来自线程:%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
//任务2
for (int i = 0; i < 2 ; i++) {
NSLog(@"我是任务二、来自线程:%@",[NSThread currentThread]);
}
});
dispatch_barrier_async(queue, ^{
//珊栏
for (int i = 0; i < 1 ; i++) {
NSLog(@"我是分割线、来自线程:%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
//任务3
for (int i = 0; i < 1 ; i++) {
NSLog(@"我是任务三、来自线程:%@",[NSThread currentThread]);
}
});
复制代码
分析:任务一和任务二相互交错执行、由于珊栏函数存在、任务三最后执行。这三个任务都是异步完成、在各自的线程里。
dispatch_barrier_async 、dispatch_barrier_sync区别
直接看如下代码:
1.dispatch_barrier_async
NSLog(@"开始啦");
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
//任务1
for (int i = 0; i < 2; i++) {
NSLog(@"我是任务一、来自线程:%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
//任务2
for (int i = 0; i < 2 ; i++) {
NSLog(@"我是任务二、来自线程:%@",[NSThread currentThread]);
}
});
NSLog(@"动啊动啊");
dispatch_barrier_async(queue, ^{
//珊栏
for (int i = 0; i < 1 ; i++) {
NSLog(@"我是分割线、来自线程:%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
//任务3
for (int i = 0; i < 1 ; i++) {
NSLog(@"我是任务三、来自线程:%@",[NSThread currentThread]);
}
});
NSLog(@"结束啦");
复制代码
打印结果:
2019-01-25 13:47:17.656139+0800 多线程demo[4912:51826] 开始啦
2019-01-25 13:47:17.656348+0800 多线程demo[4912:51826] 动啊动啊
2019-01-25 13:47:17.656463+0800 多线程demo[4912:51882] 我是任务一、来自线程:<NSThread: 0x60000047f740>{number = 3, name = (null)}
2019-01-25 13:47:17.656470+0800 多线程demo[4912:51884] 我是任务二、来自线程:<NSThread: 0x60000047ed00>{number = 4, name = (null)}
2019-01-25 13:47:17.656599+0800 多线程demo[4912:51826] 结束啦
2019-01-25 13:47:17.656654+0800 多线程demo[4912:51884] 我是任务二、来自线程:<NSThread: 0x60000047ed00>{number = 4, name = (null)}
2019-01-25 13:47:17.656654+0800 多线程demo[4912:51882] 我是任务一、来自线程:<NSThread: 0x60000047f740>{number = 3, name = (null)}
2019-01-25 13:47:17.657139+0800 多线程demo[4912:51882] 我是分割线、来自线程:<NSThread: 0x60000047f740>{number = 3, name = (null)}
2019-01-25 13:47:17.657313+0800 多线程demo[4912:51882] 我是任务三、来自线程:<NSThread: 0x60000047f740>{number = 3, name = (null)}
复制代码
分析:任务三确实在任务一、任务二之后完成。使用dispatch_barrier_async、体现了异步的特点、不做任何等待、直接返回。所以主线程中的打印、不会在珊栏函数后面。
2.dispatch_barrier_sync
代码如下:
NSLog(@"开始啦");
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
//任务1
for (int i = 0; i < 2; i++) {
NSLog(@"我是任务一、来自线程:%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
//任务2
for (int i = 0; i < 2 ; i++) {
NSLog(@"我是任务二、来自线程:%@",[NSThread currentThread]);
}
});
NSLog(@"动次打次:%@",[NSThread currentThread]);
dispatch_barrier_sync(queue, ^{
//珊栏
for (int i = 0; i < 1 ; i++) {
NSLog(@"我是分割线、来自线程:%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
//任务3
for (int i = 0; i < 1 ; i++) {
NSLog(@"我是任务三、来自线程:%@",[NSThread currentThread]);
}
});
NSLog(@"结束啦");
复制代码
打印结果:
2019-01-25 13:54:09.045223+0800 多线程demo[5014:57352] 开始啦
2019-01-25 13:54:09.045461+0800 多线程demo[5014:57352] 动次打次:<NSThread: 0x600000072f00>{number = 1, name = main}
2019-01-25 13:54:09.045486+0800 多线程demo[5014:57400] 我是任务二、来自线程:<NSThread: 0x60000026dd80>{number = 4, name = (null)}
2019-01-25 13:54:09.045496+0800 多线程demo[5014:57404] 我是任务一、来自线程:<NSThread: 0x600000260b80>{number = 3, name = (null)}
2019-01-25 13:54:09.045758+0800 多线程demo[5014:57400] 我是任务二、来自线程:<NSThread: 0x60000026dd80>{number = 4, name = (null)}
2019-01-25 13:54:09.045830+0800 多线程demo[5014:57404] 我是任务一、来自线程:<NSThread: 0x600000260b80>{number = 3, name = (null)}
2019-01-25 13:54:09.045991+0800 多线程demo[5014:57352] 我是分割线、来自线程:<NSThread: 0x600000072f00>{number = 1, name = main}
2019-01-25 13:54:09.046099+0800 多线程demo[5014:57352] 结束啦
2019-01-25 13:54:09.046124+0800 多线程demo[5014:57404] 我是任务三、来自线程:<NSThread: 0x600000260b80>{number = 3, name = (null)}
复制代码
分析:确实分割了前后执行的任务
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 线程切换函数schedule的实现
- java中线程安全,线程死锁,线程通信快速入门
- ObjC 多线程简析(一)-多线程简述和线程锁的基本应用
- Java多线程之线程中止
- Android 的线程和线程池
- iOS 多线程之线程安全
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Boolean Reasoning
Brown, Frank Markham / 2003-4 / $ 19.15
A systematic treatment of Boolean reasoning, this concise, newly revised edition combines the works of early logicians with recent investigations, including previously unpublished research results. Th......一起来看看 《Boolean Reasoning》 这本书的介绍吧!
XML、JSON 在线转换
在线XML、JSON转换工具
HEX HSV 转换工具
HEX HSV 互换工具