GCD( Grand Central Dispatch )是异步执行任务的技术之一
开发者只需要定义想执行的任务并追加到适当的 Dispatch Queue 中,GCD 就能生成必要的线程并计划的执行任务
Dispatch Queue 是执行处理的等待队列(先进先出),共有两种等待队列:
Serial Dispatch Queue 等待处理结束队列(串行)
Concurrent Dispatch Queue 不等待处理结束队列(并行)
dispatch_queue_t 获取方法
1、dispatch_queue_create
//通过 GCD 的 API 生成 Dispatch Queue,
//第一个参数是指定 dispatch_queue 的名称
//第二个参数是指 dispatch_queue 的类型
//生成Serial Dispatch Queue
dispatch_queue_t queue = dispatch_queue_create("com.example",DISPATCH_QUEUE_SERIAL);
//生成Concurrent Dispatch Queue
dispatch_queue_t queue = dispatch_queue_create("com.example2",DISPATCH_QUEUE_CONCURRENT);
2、获取系统标准提供的 Dispatch Queue
//主线程 Serial Dispatch Queue
dispatch_get_main_queue();
//全局的Concurrent Dispatch Queue,第一参数是优先级
//第二个参数暂时没用
//(高优先级)
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);
//(默认优先级)
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
//(低优先级)
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0);
//(后台优先级)
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
dispatch_after 延时执行方法
//延时操作,在指定时间追加处理到Dispatch Queue
//第一个参数指定时间,第二个参数指定多少秒后的时间
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,3*NSEC_PER_SEC);
dispatch_after(time,dispatch_get_main_queue(),^{
NSLog(@"aaa");
});
dispatch_sync 同步操作
- dispatch_sync() 是线程同步操作,其作用就是阻塞线程,先让它的block执行完毕,才会返回。
- dipatch_sync() 造成死锁的条件是:如果在同一个串行队列(不管是不是主队列)添加同步任务,就会死锁,反之则不会
dispatch_apply 快速迭代方法
//作用:按照指定的次数将指定的任务追加到指定的队列中,并等待全部队列执行结束
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSLog(@"apply---begin");
dispatch_apply(6, queue, ^(size_t index) {
NSLog(@"%zd---%@",index, [NSThread currentThread]);
});
NSLog(@"apply---end");
dispatch_semaphore 信号量
//是持有计数的信号,计数小于0时等待,不可通过。计数为0或者大于0时,计数减1且不等待,可通过。
//保持线程同步,将异步执行任务转为同步执行任务
//保证线程安全,为线程加锁
//创建一个Semaphore并初始化信号的总量
//这里的传入的参数value必须大于或等于0,否则dispatch_semaphore_create会返回NULL。
dispatch_semaphore_semaphore_create:
//发送一个信号,让信号总量加1
//当返回值不为0时,表示其当前有(一个或多个)线程等待其处理的信号量
//并且该函数唤醒了一个等待的线程(当线程有优先级时,唤醒优先级最高的线程;否则随机唤醒)。
dispatch_semaphore_signal:
//可以使总信号量减1,信号总量小于0时就会一直等待(阻塞所在线程),否则就可以正常执行
//这个函数的作用是这样的,如果信号量的值大于0,该函数所处线程就继续执行下面的语句,并且将信号量的值减1;
//如果信号量的值为0,那么这个函数就阻塞当前线程等待timeout(注意timeout的类型为dispatch_time_t,不能直接传入整形或float型数)
//如果等待的期间信号量的值被dispatch_semaphore_signal函数加1了,
//且该函数(即dispatch_semaphore_wait)所处线程获得了信号量,那么就继续向下执行并将信号量减1。
//如果等待期间没有获取到信号量或者信号量的值一直为0,那么等到timeout时,其所处线程自动执行其后语句。
dispatch_semaphore_wait:
通过 GCD 的 API 生成 Dispatch Queue
[Tōngguò GCD de API shēngchéng Dispatch Queue]
Generate Dispatch Queue from GCD's API