oad的UIViewController类。
2. viewDidLoad在主线程中执行。
3. dispatch_sync闭包被加入到全局队列中稍后执行。主线程停下来等待闭包完成。同时,全局队列正在并发执行任务;记住闭包以FIFO的顺序从全 局队列中取出,但是会并发地执行。全局队列首先处理dispatch_sync闭包加入前已经存在队列中的任务。
4. 最后,轮到dispatch_sync闭包执行。
5. 闭包执行完毕,主线程得以继续。
6. viewDidLoad方法完成,主队列接着处理其它任务。
dispatch_sync把任务加入队列并一直等待其完成。dispatch_async做了差不多的工作,只是它不会等待任务完成,而是转而去继续其他工作。
重访dispatch_async
1
2
3
4
5
6
7
8
9
10
11
12
|
override func viewDidLoad() {
super
.viewDidLoad()
dispatch_async(dispatch_get_global_queue(
Int(QOS_CLASS_USER_INTERACTIVE.value), 0)) {
NSLog(
"First Log"
)
}
NSLog(
"Second Log"
)
}
|
1.主队列按部就班的执行任务 —— 紧接着的任务是实例化包含viewDidLoad的UIViewController类。
2.viewDidLoad在主线程中执行。
3.dispatch_async闭包被加入到全局队列中稍后执行。
4.viewDidLoad在dispatch_async后继续向下执行,主线程继续其他任务。同时,全局队列正在并发执行任务;记住闭包以FIFO的顺序从全局队列中取出,但是会并发地执行。
5.执行dispatch_async所添加的闭包。
6.dispatch_async闭包完成,NSLog输出到控制台。
在这个特别的例子中,第一个NSLog在第二个NSLog后执行。事实并非总是如此——这取决于硬件在彼时正在做什么,你无法控制或知晓哪个语句会先执行。“第一个”NSLog在某种调用情况下可能会先执行。
下一步?
在本教程中,你已经学到了如何编写线程安全的代码以及如何在保持主线程响应性的前提下执行CPU密集型的任务。
可以下载GooglyPuff,里面包含了本教程中所做的所有改进。教程的第二部分会在此基础上继续改进。