13个GCD 应用场景

作者:薛定諤

链接: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、数据库、运维等。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181206B0H7DT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券