并发的简单介绍2
1.我们会一直和分派队列打交道,所以请确保你完全理解了其背后的概念。下面有 3 种分 派队列:
Main Queue
这个队列在主线程上执行它的所有任务,Cocoa 和 Cocoa Touch 允许程序员在主线程 上调用一切 UI-related 方法。使用 dispatch_get_main_queue 函数检索到主队列的句柄。
Concurrent Queues
为了执行异步和同步任务,你可以在 GCD 中检索到这些队列。多个并发队列能够轻而 易举的并行执行多个任务,没有更多的线程管理,酷!使用 dispatch_get_global_queue 函数 检索一个并发队列的句柄。
Serial Queues
无论你提交同步或者异步任务,这些队列总是按照先入先出(FIFO)的原则来执行任 务,这就意味着它们一次执行一个 Block Object。然而,他们不在主线程上运行,所以对于 那些要按照严格顺序执行并不阻塞主线程的任务而言是一个完美的选择。使用 dispatch_queue_create 函数创建一个串行队列。一旦你使用完队列,必须使用 dispatch_release 函数释放它。
2.
Block Object是通常在Objective-C中以方法形式出现的代码包。Block Objects和GCD 共同创建了一个和谐环境,在这个环境里你能在 iOS 和 Mac OS X 上发布高性能的多线程 APPs。Block Objects和GCD有什么特别的地方呢?你可能会问。很简单:编程中,你不需 要接触线程!所有你要做的事情就是把代码放进Block Objects然后要求GCD来为你小心执 行代码。
(注意:
block 对象与普通的函数最大的区别可能就是拷贝本地变量的值,然后在 block 对象 内部进行访问,并会保存这份拷贝,以供局部访问。如果这些变量在 block 对象外修改了,那么 block 对象仍然会保存它自己拷贝的那一份。在后面会进行更多相关介绍。
)
GCD是与Block Objects一起工作的。当使用GCD执行任务时,你可以传递一个Block Object,它可以同步或者异步执行,取决于你在 GCD 中使用的方法。因此,你可以创建一 个Block Object负责下载一个作为参数传递到它的URL。单独的Block Object可以同步或者 异步应用于 APP 的任何地方,这个位置依赖于你想如何运行它。你不必使 Block Object 本 身同步或异步,你只要简单通过同步或者异步的 GCD 方法来调用它,它就会工作。
3.
操作可以同步或者异步执行代码块。你可以手动管理操作或者是把它们放到操作队列 中,这个队列会促使并发以致于你不需要思考底层线程管理。要了解在 APP 上 同步或者异步执行任务时如何使用操作和操作队列,如何使用基础线程和计时器。
Cocoa 提供了 3 种不同的操作:
Block Operation 它们促使执行一个或多个 Block Objects.
Invocation Operations 允许你在另一个当前存在的对象中调用一个方法。
Plain Operations 这些都是需要被继承普通操作的类。将要执行的代码会被写入操作对象的主要方法中。
一个 APP 的主线程是处理 UI 事件的线程。如果你在主线程执行一个长时间运行的任 务,就要注意 APP 的 UI 会没有响应或者响应缓慢。为了避免这一点,你可以创建一个独立 线程和/或计时器,它们会分别执行各自的任务(即使是一个长时间运行的任务)同时又不 会阻塞主线程。