第43条,掌握 GCD 及操作队列的使用时机(重点)
- GCD是纯C的API,而操作队列则是OC的对象。
- GCD中,任务用块来表示,块是个轻量级的数据结构。
- 那些只需要使用一次的代码,使用GCD的dispatch_once最方便。
- NSOperation及NSOperationQueue的好处:取消某个操作;指定操作间的依赖关系;通过键值观测机制监控NSOperation的属性(是否取消isCancelled、是否操作完成isFinished);指定操作的优先级;重用NSOperation对象。
- 在解决多线程与任务管理问题时,派发队列并非唯一方案。
- 操作队列提供了一套高层的OC API能实现纯C GCD所具备的绝大部分功能,而且还能完成一些更复杂的操作,那些操作若改用GCD来实现,则需另外编写代码。
关键词:NSOperation、NSOperationQueue
第44条,通过 Dispatch Croup 机制,根据系统资源状态来执行任务
- dispatch group 是GCD的一项特性,能够把任务分组。
- 作用:将并发执行的多任务合为一组,然后统一执行完毕后回调。
- 实际中应用:压缩一系列的文件。
- dispatch group的样式:dispatch_group_t、dispatch_group_create、dispatch_group_async、dispatch_group_enter/dispatch_group_leave、dispatch_group_wait
- dispatch_apply:会阻塞线程,直到所有的任务都执行完毕为止。假如把块派给了当前队列(或者体系中高于当前队列的某个串行队列),就将导致死锁。
- 一系列任务可归入一个dispatch group之中,开发者可以在这组任务执行完毕时获得通知。
- 通过dispatch group 可以在并发式队列里同时执行多项任务。此时GCD会根据系统资源状况来调度这些并发执行的任务。开发者若自己来实现此功能,则需编写大量代码。
关键词:dispatch group、多任务打包处理
第45条,使用 dispatch_once 来执行只需运行一次的线程安全代码
- dispatch_once 能够简化并彻底保证线程的安全,开发者无需担心加锁或同步。
- 经常需要编写“只需要执行一次的线程安全代码”,通过GCD所提供的dispatch_once函数,很容易实现此功能。
- 标记应该声明在static或global作用域中,这样的话,在把只需要执行一次的块给dispatch_once函数时,传进去的标记也是相同的。
关键词:执行一次的线程安全、dispatch_once
第46条,不要使用 dispatch_get_current_queue
- dispatch_get_current_queue 函数的行为常常与开发者所预期的不同。此函数已经废弃,只应做调试之用。
- 由于派发队列是按层级来组织的,所以无法单用某个队列对象来描述“当前队列”这一概念。
- dispatch_get_current_queue 函数用于解决由不可重入的代码所引发的死锁,然而能用此函数解决的问题,通常也能改用“队列特定数据”来解决。
关键词:dispatch_get_current_queue
第47条,熟悉系统框架
- 将一系列代码封装为动态库,并在其中放入描述其接口的头文件,这样做出来的东西就叫框架。
- iOS系统框架仍然使用的动态库。
- CFNetwork 提供了C语言级别的网络通信能力。
- CoreAudio C语言API可用来操作设备上的音频硬件。
- AVFoundation:此框架提供了OC对象可用来回放并录制音频及视频。
- CoreData 提供了OC接口可将对象放入数据库。
- CoreText 提供了C语言接口可以高效执行文字排版及渲染操作。
- CoreAnimation 是OC语言写成,UI框架用这些工具渲染图形并播放动画。
- CoreGraphics 框架以C语言写成,提供了2D渲染所必备的数据结构与函数。
- Social提供了地图功能。
- 许多系统框架都可以直接使用,其中最重要的是Foundation与CoreFoundation,这两个框架提供了构建应用程序所需的许多核心功能。
- 很多常见任务都能用框架来做,例如音频与视频的处理、网络通信、数据处理。
- 用纯C写成的框架和用OC写成的一样重要,若想成为优秀的OC开发者,应掌握C语言的核心概念。
关键词:系统框架
第48条,多用块枚举,少用 for 循环
- 遍历collection有四种方式,最基本的办法是for循环,其次是NSEnumerator遍历法以及快速遍历法,最新、最先进的方法则是“块枚举法”。
- “块枚举法”本身就能通过GCD来并发执行遍历操作,无须另行编写代码。而采用其他遍历方式则无法轻易实现这一点。
- 若提前知道待遍历的collection含有何种对象,则应修改块签名,指出对象的具体类型。
关键词:块枚举