队列
- 串行队列
- 主队列:
dispatch_queue_t queue =dispatch_get_main_queue();复制代码
2.自定义的串行队列:DISPATCH_QUEUE_SERIAL
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.czw.downLoadQueue", DISPATCH_QUEUE_SERIAL);复制代码
- 并行队列
- 全局并发队列:
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);复制代码
2.自定义并行队列:DISPATCH_QUEUE_CONCURRENT
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.czw.downLoadQueue", DISPATCH_QUEUE_CONCURRENT);复制代码
基本使用
1.创建队列。
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.czw.downLoadQueue", DISPATCH_QUEUE_CONCURRENT);复制代码
2.任务添加到队列,进行(同步或异步)执行。
dispatch_async(concurrentQueue, ^{ //任务}复制代码
GCD通信
dispatch_async(dispatch_get_global_queue(0,0), ^{//1.1确定url//1.2下载二进制数据到本地//1.3转换图片//更新UI//dispatch_async(dispatch_get_main_queue(), ^{});复制代码
异步处理任务,遇到UI更新操作是在主线程里完成。
一次性执行
static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"任务执行了"); });复制代码
1.只在程序运行期间执行一次。2.block块内线程安全。3.原理:通过判断onceToken=0来决定是否执行。复制代码
主要用在单例。
延迟执行
- performSlector
[self performSelector:@selector(run) withObject:nil afterDelay:2];复制代码
- NSTimer
[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(run) userInfo:nil repeats:NO];复制代码
- GCD延迟执行:dispatch_after
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"任务执行了"); });复制代码
//第二个参数:改变线程。原理:先延迟时间,在把任务提交到队列执行。复制代码
控制线程个数
信号量机制
1.创建信号量
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);复制代码
2.降低信号量
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);复制代码
3.提升信号量
dispatch_semaphore_signal(semaphore)复制代码
信号量类似锁的机制:信号量就是个阀门,降低信号量(阀门变低),水可以通过。
信号量控制并发数。相较于operationQueue,GCD稍显麻烦。
dispatch_queue_t workConcurrentQueue = dispatch_queue_create("czw", DISPATCH_QUEUE_CONCURRENT);dispatch_queue_t serialQueue = dispatch_queue_create("c",DISPATCH_QUEUE_SERIAL);dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);for (NSInteger i = 0; i < 10; i++) { dispatch_async(serialQueue, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_async(workConcurrentQueue, ^{ NSLog(@"thread:%@开始执行任务%d",[NSThread currentThread],(int)i); sleep(1); NSLog(@"thread:%@结束执行任务%d",[NSThread currentThread],(int)i); dispatch_semaphore_signal(semaphore);}); });}复制代码
快速遍历
原理:开启多个线程,并发执行(放在并发队列才真正起作用。)
栅栏函数
dispatch_barrier_async:不能在全局并发队列使用
队列组
1.第一种方法。
dispatch_group_asyncdispatch_group_notify复制代码
2.第二种方法。
dispatch_group_enter()dispatch_group_leave()复制代码