再次学习GCD
一、任务
任务:线程中那个执行的代码段。
执行任务分为两种:
下面是我自己的想法,不知道对不对。
同步:老鹰捉小鸡(游戏) -- 老鹰一次抓一个小鸡。
异步:吃鸡游戏(各干各的) -- 大家一块
1.sync(同步):等待队列的任务执行结束
dispatch_sync(dispatch_queue_t,^{
//执行代码
});
NSLog(@"hello,sync");
直白说就是:代码自行到dispatch_sync(),会执行Block块---blockSync(形参),
blockSync执行结束后,执行NSLog,输出hello,sync!!!!
2.async(异步):开启新线程
dispatch_async(dispatch_queue_t,^{
//执行代码
});
NSLog(@"hello,async");
直白说就是:代码执行到dispatch_async();会直接执行NSLog,输出hello,async!!!
然后异步执行BlockL块blockAsync;
二、队列----特殊的线性表,FIFO
1.Serial Dispatch Queue(串行队列)
一个接一个,五个一个窗口排队买票
1.1创建方法
1. dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_SERIAL);
2. 主队列
dispatch_queue_t queue = dispatch_get_main_queue();
2.Concurrent Dispatch Queue(并发队列)
一起执行,五个人五个窗口买票
2.1创建方法
1. dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT);
2. 全局并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
三、其他方法
3.1 GCD 栅栏方法:dispatch_barrier_async
在执行完栅栏前面的操作之后,才执行栅栏操作,最后再执行栅栏后边的操作
3.2 GCD 延时执行方法:dispatch_after
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(),^{
//延迟2s
});
3.3 GCD 一次性代码(只执行一次):dispatch_once
单例创建
3.4 GCD快速迭代方法:dispatch_apply
3.5 GCD队列组:dispatch_group/dispatch_group_notify/dispatch_group_wait
3.5.3 GCD dispatch_group_enter/dipatch_group_leave
3.6 GCD信号量 dispatch_semaphore
3.6.1 Dispatch Semaphore线程同步
3.6.2 Dispatch Semaphore线程安全和线程同步(为线程加锁)
3.6.2.1 非线程安全(不使用 semaphore)
3.6.2.2 线程安全(使用semaphore加锁)