
队列
- 串行队列
- 主队列:
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_async
dispatch_group_notify
2.第二种方法。
dispatch_group_enter()
dispatch_group_leave()