Effective Objective-C 2.0读书笔记(八)

第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含有何种对象,则应修改块签名,指出对象的具体类型。

关键词:块枚举

原文地址:https://www.cnblogs.com/akiha/p/13267662.html