GCD 就是苹果给我们封装好的异步执行的代码~
苹果官方对GCD的说明:开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中。
dispatch_async(queue, ^{
//想要做的事
})
Dispatch Queue 就是执行处理的等待队列,按照FIFO先进先出的顺序执行
并且Dispatch Queue还分为两种:
- Serial Dispatch Queue 即只使用单线程,执行完成的顺序和执行顺序一致---串行队列
- Concurrent Dispatch Queue 多个线程一起执行。执行完成的顺序和执行顺序不一致---并行队列
创建队列:
串行队列:
dispatch_queue_t serialQueue = dispatch_queue_create
("info.byhuang.SerialQueue", DISPATCH_QUEUE_SERIAL);
//可以是使用NULL代替DISPATCH_QUEUE_SERIAL 详情可以看这个宏的定义
* 并行队列:
* ```
dispatch_queue_t concurrentQueue = dispatch_queue_create
("info.byhuang.ConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
创建出来的是不是串行或并行,大家可以自己测试一下即可
当然系统也为我们提供了几个不同优先级的并行队列,让我们可以快速使用:
//优先级最高队列- 并行
dispatch_queue_t globalHighQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
//默认优先级
dispatch_queue_t globalDefaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//低优先级
dispatch_queue_t globalLowQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
//后台运行
dispatch_queue_t globalBackgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
在前面我们自己创建的队列也是有优先级的,它的默认优先级是default
,如果
我们想要修改它的优先级就需要使用target_queue
//自定义一个队列
dispatch_queue_t highQueue = dispatch_queue_create("info.byhuang.highQueue", DISPATCH_QUEUE_CONCURRENT);
//变更队列的优先级
dispatch_set_target_queue(highQueue, globalHighQueue);
如果我们需要在固定的时间之后把某个操作假如到队列中怎么办呢?没关系已经有现成的可以用啦~~ dispatch_after
,就可以帮你解决!
//ull是c语言的数值字面量
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*3ull);
dispatch_after(time, highQueue, ^{
NSLog(@"Hi byhuang ");
});
但是要注意dispatch_after
>不是在指定事件执行而是在指定时间之后加入到队列中,所以等待时间会大雨等于time。因为有可能队列中任务有很多啊,我们在三秒中之后只是加入到队列中,还没有算等待的时间呢
;
需要在队列中任务执行完之后再执行某个任务的时候就要用到dispatch_group
dispatch_group_t group = dispatch_group_create();
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"全部执行完了");
});
//需要配合 dispatch_group_async使用加入到group中
dispatch_group_async(group, highQueue, ^{
NSLog(@"111zz");
});
group中可以包含有不同队列中的任务。只有把任务加入到group中。当任务执行完就会调用dispatch_group_notify
来执行我们所追加的任务了,怎么样是不是很简单~
还有一种当单个队列中任务执行完成之后再执行某个任务的方法dispatch_barrier_async
//使用dispatch_barrier_async用来在并行队列都执行完之后,再执行的操作.
dispatch_barrier_async(concurrentQueue, ^{
//全部执行完再执行
NSLog(@"2");
});
dispatch_sync:同步执行,不执行完不会返回返回结果。极其容易造成死锁,所以我们尽量避免使用,尤其是在主线程中!
dispatch_apply:根据次数来向主线程中添加几次操作。
dispatch_suspend:挂起指定的线程
dispatch_resume:恢复指定的线程
//同步的--在主线程中千万不要使用,否则会造成卡死
dispatch_sync(concurrentQueue, ^{
NSLog(@"byhuang");
});
//根据次数来指定,向队列中添加几次操作
dispatch_apply(3, concurrentQueue, ^(size_t index) {
NSLog(@"添加三次");
});
//指定挂起的队列
dispatch_suspend(concurrentQueue);
//恢复指定的队列
dispatch_resume(concurrentQueue);
我想上面这些操作已经足够我们的平常使用,最后一起学习共勉~
我的个人博客地址byhuang的技术博客
和一起同步更新~~