初学Grand Central Dispatch后的初步梳理

既然是初步学习,还未在实践中充分打磨,这里的总结难免会有错误,欢迎大家指正!

快速学习一个知识点的技巧就是先了解其核心思想。

在系统了解Grand Central Dispatch(GCD)之前,还是受了很多以前在Visual C++里使用多线程的影响,惯性思维导致在理解GCD上遇到困难。学习GCD是一个全新的多线程学习之路,理解后有种恍然大悟的感觉,原来多线程还可以这么来做。
学习GCD的要点,记住以下三个要素,三个步骤,GCD的精髓就掌握了一半:

3个基本组成部分:队列(dispatch_queue_t),代码块(dispatch_block_t),分发源(dispatch_source_t)。

启动一个任务的顺序是:

-创建一个任务队列;

-创建一个代码块;

-将代码块作为一个待执行的任务加入任务队列中;

-如果需要在特定事件发生后再将任务块加入队列中,那么只需要定义分发触发源dispatch_source_t。
要说使用GCD来实现多任务的思路的确不同于以往我使用的多线程技术,有以下不同点:

1,从头到尾我们都没有直接创建线程,也没有直接操作线程;我们只能创建任务分发队列;

2,GCD巧妙利用了block技术,需要执行的任务都在写在了block里;

3,可以往任务分发队列里加入更多的任务块。

做个形象的比喻,在vc中我们要启动一个多线程,相当与专门创建了一个工人,让他来完成这件事;在iOS里使用多线程,类似于在银行办理业务,先创建了办理多个业务窗口(dispatch_queue_t),然后每个客户(dispatch_block_t)都在窗口前排队等待办理业务。只要什么时候系统会巡查队列,又在什么时候处理任务块,其实都不受我们控制。
Serial&Concurrent:

Serial:串行化处理任务块,也就是说队列里的任务块必须挨个执行;Concurrent:是指可以并处理任务块,不必要等待上一个任务结束。还是拿银行办理业务做比方,serial相当于只安排了一个窗口来处理任务块,而concurrent相当于安排了多个窗口来处理业务块。所谓并行还是要看系统有多少闲置线程能同时处理任务,并不是说会同时给每个任务块都创建线程。究竟有多少线程,这个要看系统,硬件,当时运行任务多少而定;
创建&获取队列:

并非每次都需要创建任务队列,也可以获取系统主队列(实质是串行队列),也可以获取全局队列(实质是并行队列)
block&ARC&Runtime

GCD的实现借助了block,因此必须先了解block,而后再学习GCD;使用GCD功能时,需要更加关注内存管理,ARC的使用,防止循环引用的出现;GCD的实现也借助了运行时库的功能,这方面只是似乎介绍的很少。
GCD还提供了很多简便的用法,不能一一列出,写一下我印象深刻的:

1,借助dispatch_source_t,可以定义在什么时机将任务块加入任务队列中,可以将其看作为一个触发源。

2,dispatch_time_t是一个特殊的dispatch_source_t,可以定义特定时间后,将任务加入队列。

3,我们可以随时终止一个dispatch_source_t。

4,我们无法终止一个运行中dispatch_queue_t,但是可以挂起,或继续队列的分发。

5,还有其他一些快捷用法:dispatch_once,dispatch_after。

你可能感兴趣的:(初学Grand Central Dispatch后的初步梳理)