1. GCD(Grand Central Dispatch)
- 介绍
通过 GCD,开发者不用再直接跟线程打交道了,只需要向队列中添加代码块即可,GCD 在后端管理着一个线程池。GCD 不仅决定着你的代码块将在哪个线程被执行,它还根据可用的系统资源对这些线程进行管理。这样可以将开发者从线程管理的工作中解放出来,通过集中的管理线程,来缓解大量线程被创建的问题。
GCD 公开有 5 个不同的队列:运行在主线程中的 main queue,3 个不同优先级的后台队列,以及一个优先级更低的后台队列(用于 I/O)。
另外,开发者可以创建自定义队列:串行或者并行队列。自定义队列非常强大,在自定义队列中被调度的所有 block 最终都将被放入到系统的全局队列中和线程池中。
2.Operation Queues
-
介绍
操作队列(operation queue)是由 GCD 提供的一个队列模型的 Cocoa 抽象。GCD 提供了更加底层的控制,而操作队列则在 GCD 之上实现了一些方便的功能,这些功能对于 app 的开发者来说通常是最好最安全的选择。
NSOperationQueue 有两种不同类型的队列:主队列和自定义队列。主队列运行在主线程之上,而自定义队列在后台执行。在两种类型中,这些队列所处理的任务都使用 NSOperation 的子类来表述。
创建完NSOperation对象后,将其添加到NSOperationQueue队列中,即可执行。
自定义 operation 类之后,就可以很容易的将一个 operation 添加到自定义队列中,addOperation:operation之后该线程即可执行。NSOperationQueue *queue = [[NSOperationQueue alloc] init]; YourOperation *operation = [[YourOperation alloc] init]; [queue addOperation:operation];
另外,你也可以将 block 添加到操作队列中。这有时候会非常的方便,比如你希望在主队列中调度一个一次性任务:
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// 代码...
}];
-
说明:
1.maxConcurrentOperationCount :NSOperationQueue的属性控制最大并发线程数目
2.addDependency 方法定义线程间依赖关系,用于是实现一个线程执行完毕后再执行另一个线程。(GCD没有此功能)
3.更新UI需要在主线程上的主队列中执行:[NSOperationQueue mainQueue] addOperationWithBlock:^{ <#code#> }
Run Loops
一个 run loop 总是绑定到某个特定的线程中。main run loop 是与主线程相关的,在每一个 Cocoa 和 CocoaTouch 程序中,这个 main run loop 都扮演了一个核心角色,它负责处理 UI 事件、计时器,以及其它内核相关事件。无论你什么时候设置计时器、使用 NSURLConnection 或者调用 performSelector:withObject:afterDelay:,其实背后都是 run loop 在处理这些异步任务。
run loop 可以运行在不同的模式中,每种模式都定义了一组事件,供 run loop 做出响应,不同模式下,执行不同的事件。关于这点,在 iOS 中非常典型的一个示例就是滚动。在进行滚动时,run loop 并不是运行在默认模式中的,因此, run loop 此时并不会响应比如滚动前设置的计时器。一旦滚动停止了,run loop 会回到默认模式,并执行添加到队列中的相关事件。如果在滚动时,希望计时器能被触发,需要将其设为 NSRunLoopCommonModes 的模式,并添加到 run loop 中。