之前看到简书有同行总结出GCD的初级用法文章,我就整理出来这篇文章的demo,希望对大家有帮助
GCD
#######什么是GCD
全称是Grand Center Dispatch(CPU调度中心,调度的是任务和线程,把任务交给线程执行)。
纯C语言,提供了非常多、强大的函数。
GCD是libdispatch的统称,而libdispatch是苹果为了在多核硬件(如iOS、OSX)上提供处理并发代码的库。
#######GCD的优势
GCD是苹果公司为多核的并行运算提出的解决方案。
GCD会自动利用更多的CPU内核。
GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)。
只要告诉GCD想要执行什么任务,不需要编写任何线程管理的代码。
GCD能帮助你分配繁重计算任务并且保持在后台运行,帮你提高App的响应程度。
GCD帮你提供易用的并发模式,不仅仅是锁和线程,帮助你避免在开发并发程序时的bug。
GCD具有在常见模式(如单例模式)以最原始的语句优化,是你的代码具有更高的效率。
GCD术语
串行、并行:所谓串行并行描述是相对而言的,串行是指在同一时间只执行一个任务,并行是指在同一时间可能执行多个任务。
同步、异步:在GCD中,同步异步是为了描述一个函数相对于该函数要求GCD执行完成的另一个任务。同步方法只在它完成它需要做的任务后才会返回。异步方法刚好和同步方法相反,它不会等待任务完成才返回,它会立即返回。所以异步不会阻塞当前线程执行另一个任务(方法\函数)。
死锁:两个(有时更多)东西——在大多数情况下,是线程——所谓的死锁是指它们都卡住了,并等待对方完成或执行其它操作。第一个不能完成是因为它在等待第二个的完成。但第二个也不能完成,因为它在等待第一个的完成。
线程安全:线程安全的代码在多线程或并发任务中被安全的调用,而不会导致任何问题(数据损坏、崩溃等)。线程不安全的代码在某个时刻只能在一个上下文中运行。一个线程安全代码的例子是NSDictionary,你可以在同一时间在多个线程中使用它而不会有问题,另一方面,NSMutableDictionary就不是线程安全的,应该保证一次只能一个线程访问它。
#######GCD使用步骤
定制任务:确定要执行的操作(方法)。
将任务添加到队列中,并按照指定的同步或异步方式执行任务。
GCD会自动将队列中的任务取出,放到对应的线程中执行。
任务的取出遵循队列的先进先出原则。
队列
GCD提供了dispatch queues(调度队列)来执行代码段,这些队列以FIFO(先进先出)的方式来管理你用GCD提交的任务。这保证了你先提交的任务先执行,即第一个任务添加到队列中就第一个开始执行,第二个添加的任务将第二个执行,直到队列的最后一个任务。
所有的调度队列(dispatch queues)自身都是线程安全的,你能通过多个现成来访问它们。
串行队列:在串行队列中,同一个队列中只有一个任务在执行,每个任务只有在前一个任务执行完成后才能开始执行。而且,你不知道在一个Block(任务)执行结束到下一个Block(任务)开始执行之间的这段时间是多长。这些任务的执行时机完全是在GCD的控制之下,你能唯一保证的是:GCD一次只能执行一个任务以及它会按照你添加到队列中的先后顺序来执行任务。在串行队列中,不会有两个任务并发执行。
并发队列:在并发队列中,你唯一能保证的是,这些任务会按照被添加的顺序开始执行,但是任务可以以任何顺序完成,你不知道在执行下一个任务是从什么时候开始,或者说任意时刻有多个Block(任务)执行,这个完全是取决于GCD。
在什么时候执行Block完全是由GCD来决定,如果一个Block的执行时间与另外一个Block重叠,GCD就会决定是否将另一个任务运行在不同的核上,除非那个核不能使用,否则GCD将通过切换上下文方式将任务运行在另一个核上。
GCD的核心概念
任务:要执行的操作(方法)。
队列:用来存放任务的集合。
将任务添加到队列,指定任务执行的方法。
任务:使用block封装,block就是一个提前准备好的代码块,在需要的时候执行。
队列:
串行队列:一个接一个的调度任务。
并发队列:可以同时调度多个任务。
主队列:全局串行队列,由主线程串行调度任务,并且只有一个。
全局队列:没有名称的并发队列。
执行任务的函数:
同步执行:当前指令不完成,就不会执行下一条指令。
异步执行:当前指令不完成,同样可以执行下一条指令
以上是概念,下面是连接文章和里面的demo
文章连接:http://www.jianshu.com/p/e6905468c780
下载:demo
喜欢的可以点下star,谢谢支持