队列:
队列是存放待处理模块的方式,需要开线程去执行。
1、Dispatch Queue:将要执行的任务追加到Dispatch Queue队列中
注:Queue需手动释放(一般给block持有,出block自动释放)
Dispatch_async(queue,^{
/*
**想执行的任务
*/
});
1.1、Serial Diapatch Queue 等待队列:
等待上一步执行结束才执行下一个步骤,同步,一般是单线程来处理
线程0 |
Blk0 |
Blk1 |
Blk2 |
Blk3 |
创建:
1. 通过GCD的API:dispatch_queue_create
指定参数为:NULL
dispatch_queue_t SerialQueue = dispatch_queue_create("my.Serial .queue", NULL);
Concurrent Diapatch Queue 不等待队列:
不需要等待上一个步骤操作完才进行下一个,异步,一般是多线程来处理
线程0 | 线程1 | 线程2 |
Blk0 | Blk2 | Blk1 |
Blk3 | Blk5 | Blk4 |
创建:
1、通过GCD的API:dispatch_queue_create
指定参数为:DISPATCH_QUEUE_CONCURRENT
dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
对于那些对同一块数据处理的操作可以使用单线程同步队列或者多线程加锁
- 1. 1 Dispacth _sync( )同步添加操作。他是等待添加进队列里面的操作完成之后再继续执行。
dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"1");
dispatch_sync(concurrentQueue, ^(){
NSLog(@"2");
[NSThread sleepForTimeInterval:10];
NSLog(@"3");
});
NSLog(@"4");
输出 :
11:36:25.313 GCDSeTest[544:303] 1
11:36:25.313 GCDSeTest[544:303] 2
11:36:30.313 GCDSeTest[544:303] 3//模拟长时间操作
11:36:30.314 GCDSeTest[544:303] 4 - 2. 2 Dispacth_async()异步添加进任务队列,它不会做任何等待
dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"1");
dispatch_async(concurrentQueue, ^(){
NSLog(@"2");
[NSThread sleepForTimeInterval:5];
NSLog(@"3");
});
NSLog(@"4");
输出:
11:42:43.820 GCDSeTest[568:303] 1
11:42:43.820 GCDSeTest[568:303] 4
11:42:43.820 GCDSeTest[568:1003] 2
11:42:48.821 GCDSeTest[568:1003] 3//模拟长时间操作时间