ios项目中使用gcd的场景_iOS中超级超级详细介绍GCD

本文是来自@FlyOceanFish的投稿

Grand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。

Dispatch Queue将想执行的任务追加到适当的Dispatch QueueDispatch Queue种类说明Serial Dispatch Queue串行队列,任务按照追加顺序处理(FIFO)

Concurrent Dispatch Queue并行队列

串行队列

并行队列

重点

串行队列只有一个线程,并行队列有多个线程。

自建Queuedispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_CONCURRENT);//创建了一个并行队列 dispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_SERIAL);//创建了一个串行队列

系统QueueMain DispatchQueue 在主线程中执行的Dispatch Queue。因为主线程只有1个,所以Main Dispatch Queue是串行队列。加入到主队列中的任务一定不会生成新的线程,因为主队列必须有且只有一条主线程。

Global Dispatch Queue 一个所有应用程序都能够使用的并发队列。加入到该队列中的任务不一定会生成线程。因为有线程重用的现象

iOS8.0之后的权限名称描述QOS_CLASS_USER_INTERACTIVE与用户交互的任务,这些任务通常跟UI级别的刷新相关,比如动画,这些任务需要在一瞬间完成

QOS_CLASS_USER_INITIATED由用户发起的并且需要立即得到结果的任务,比如滑动scroll view时去加载数据用于后续cell的显示,这些任务通常跟后续的用户交互相关,在几秒或者更短的时间内完成

QOS_CLASS_DEFAULT优先级介于user-initiated 和 utility,当没有 QoS信息时默认使用,开发者不应该使用这个值来设置自己的任务

QOS_CLASS_UTILITY一些可能需要花点时间的任务,这些任务不需要马上返回结果,比如下载的任务,这些任务可能花费几秒或者几分钟的时间

QOS_CLASS_BACKGROUND这些任务对用户不可见,比如后台进行备份的操作,这些任务可能需要较长的时间,几分钟甚至几个小时

QOS_CLASS_UNSPECIFIED未指定

Dispatch Group

dispatch_group是GCD的一项特性,能够把任务分组。调用者可以等待这组任务执行完毕,也可以提供回调函数之后继续往下执行,这组任务完成时,调用者会得到通知。常用场景比如说,下载一个大的文件,分块下载,全部下载完成后再合成一个文件。再比如同时下载多个图片,监听全部下载完后的动作创建groupdispatch_group_t group = dispatch_group_create();添加任务dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block);

将一个任务添加到指定group中

dispatch_group_enter(dispatch_group_t group); dispatch_group_leave(dispatch_group_t group);

这两个函数同上边一样的效果,不过一定要注意这两个函数必须成对出现!否则这一组任务就永远执行不完。

监听任务完成

timeout参数表示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值