作者:薛定諤
链接:https://juejin.im/post/5a38c19c6fb9a0450809c77c
本文不涉及 GCD 的概念和理论,仅记录了 GCD 在一些开发场景下的应用。
嗯,欢迎大家积极留言补充。
耗时操作
这是应用最广泛的场景,为了避免阻塞主线程,将耗时操作放在子线程处理,然后在主线程使用处理结果。比如读取沙盒中的一些数据,然后将读取的数据展示在 UI,这个场景还有几个细分:
执行一个耗时操作后回调主线程
串行耗时操作
每一段子任务依赖上一个任务完成,全部完成后回调主线程:
并发耗时操作
每一段子任务独立,所有子任务完成后回调主线程:
延时执行
延时一段时间后执行代码,一般见于打开 App 一段时间后,弹出求好评对话框。
定时器
由于 Timer 的 Target 是强引用,对于 Timer 的销毁需要特别处理,此外,Timer 的运行依赖于 Runloop,在 Runloop 的一次循环中,Timer 也只会执行一次,这使得在 Runloop 负担比较重时,可能会跳过 Timer 的执行,因此,在用到定时器的地方,你也可以用 CGD 的 TimerSource 替代:
并发遍历
如果你需要更快的处理数据,可以用 concurrentPerform 让循环操作并发执行:
控制并发数
有时我们需要并发处理一些任务,但是并不想同时开很多线程,GCD 并没有类似 NSOperation 最大并发数的概念,但可以借助信号量实现:
时序管理
时序管理主要有几种组合情况:
子任务内是否开线程;
子任务是否依次执行;
子任务内不开线程依次执行
参照耗时操作小节。
子任务内开线程依次执行
一般见于网络请求,一个接口的请求参数是另一个接口的返回值,这种情况就需要对网络请求进行时序管理,以下代码表示一个网络请求的封装:
在子线程可开线程的情况下,依次执行需要借助信号量控制:
子任务内开线程不依次执行
这种情况多见于需要请求多个接口,全部请求完毕后再进行某些操作,这可以借助 GCD 的任务组处理:
自定义数据监听
当需要监听某个数据的变化,但不需要频繁的调用其对应的回调处理,可以使用 DispatchSourceUserData 进行监听,它会自动合并更改,并在队列空闲时进行回调,以节省 CPU 开销。
监听进程
在 Mac 开发中,你可以监听其他进程的开启关闭情况:
监听目录结构
线程安全
你可以在资源读写时对其所在线程进行一些限制,而不必使用线程锁,比如:
或者开启一个串行队列同步读写任务:
●编号345,输入编号直达本文
●输入m获取文章目录
推荐↓↓↓
Web开发
更多推荐《25个技术类微信公众号》
涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等。
领取专属 10元无门槛券
私享最新 技术干货