GCD(Grand Central Dispatch),是苹果提供的一个解决多线程开发的解决方案。GCD会自动管理线程的生命周期(创建线程,调度任务,销毁线程),完全不需要我们管理,我们只需要告诉干什么就行。同时GCD使用block来进行任务的执行,用起来非常方便、灵活。本篇博客我们主要将GCD,其他的多线程实现方式还有NSThread、NSOperationQueue,我们将会在以后的博客中讲解。
这里我们要提到一个概念:【任务】。就是操作,就是你要执行的一段代码,在GCD中就是一个Block,所以添加任务十分方便。
【同步执行】:只要是同步执行的任务,都会在当前线程执行,不会另开线程。所以说网络请求等耗时操作一般不使用同步,而是异步,否则会阻塞主线程,界面会卡住。
【异步执行】:只要是异步任务执行的任务,都会另开线程,在别的线程执行。
同步(sync)和异步(async)的主要区别在于会不会阻塞当前线程,直到Block中的任务执行完毕。
如果是同步(sync)操作,它会阻塞当前线程并等待Block中的任务执行完毕,然后当前线程才会继续往下运行(因为同步操作没有开新线程,是在主线程中执行的,所以会阻塞)。
如果是异步(async)操作,当前线程会直接往下执行,他不会阻塞当前线程(因为异步操作是在另一个线程中执行的,所以不会阻塞主线程)。
队列:用于存放任务,一共有两种队列:串行队列和并行队列。
1.串行队列(private dispatch queue)一次只执行一个线程,按照添加到队列的顺序依次执行;
2.并行队列(global dispatch queue)一次可以执行多个线程,线程的执行没有先后顺序。根据同步或者异步有不同的执行方式。放到并行队列的任务,GCD也会FIFO的取出来,但不同的是,他取出来一个就会放到别的线程,然后再取出来一个又放到另一个线程。