ispatch Queue是一个任务执行队列,可以让你异步或同步地执行多个Block或函数。Dispatch Queue是FIFO的,即先入队的任务总会先执行。目前有三种类型的Dispath Queue:
1.串行队列(Serial dispatch queue)
2.并发队列(Concurrent dispatch queue)
3.主队列(Main dispatch queue)
dispatch_queue_t 为线程队列,该队列有三种类型,主队列,串行队列,并行队列。
串行队列,一次只能执行一个任务,并且按顺序执行。
并行队列,会将队列内的任务并发进行,
主队列,主要是更新ui
异步开启 dispatch_async(dispatch_queue_t queue, ^{ })
开启线程后我门需要把要执行的块任务放在队列中去执行,队列dispatch_queue_t
1.1创建队列
//DISPATCH_QUEUE_SERIAL, DISPATCH_QUEUE_CONCURRENT 创建队列的两种方式
dispatch_queue_t iqueue = dispatch_queue_create("a", DISPATCH_QUEUE_SERIAL);//该队列为串行队列 任务在该队列按顺序执行,FIFO原则
dispatch_queue_t iqueue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2.开启一个线程,获得全局队列
但是在使用多线程的时候,其实不用刻意的去创建多线程,只需要获得当前的全局线程就可以
优先级
- DISPATCH_QUEUE_PRIORITY_HIGH:
- DISPATCH_QUEUE_PRIORITY_DEFAULT:
- DISPATCH_QUEUE_PRIORITY_LOW:
- DISPATCH_QUEUE_PRIORITY_BACKGROUND:
//开启一个异步任务在并发队列
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < 5; i++)
{
NSLog(@"two %d",i);
}
//回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
});
});
3.分发组
将队列中多个任务放在一组进行操作,等全部任务执行完之后响应一个方法
dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue2, ^{
for (int i = 0; i < 3000; i++) {
NSLog(@"----------");
}
});
dispatch_group_async(group, queue2, ^{
for (int i = 0; i < 1500; i++) {
NSLog(@"======");
}
});
dispatch_group_notify(group, queue2, ^{
NSLog(@"完成");
});
4. //延迟执行
double delayInSeconds = 2.0;
//创建一个调度时间,相对于默认时钟或修改现有的调度时间。
dispatch_time_t delayInNanoSeconds =dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(delayInNanoSeconds, dispatch_get_main_queue(), ^{
NSLog(@"延迟执行 ");
});
5. 程序中执行一次,多用于单例
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});