多线程
线程和进程
进程:进程是指系统中正在运行的一个应用程序,进程之间是相互独立的,拥有专有的内存。
线程:线程是进程的基本执行单元,一个进程的所有任务都在线程中执行,一个进程可以拥有多个线程,这些线程可以共享进程里的资源。
为什么要在主线程更新UI
因为 UIKit 框架不是线程安全的框架,当在多个线程进行 UI 操作,有可能出现资源抢夺,导致问题。
多线程技术方案
pthread:一套用 C 语言写的通用的多线程 API,线程生命周期由程序员管理,现在 iOS 中用到 pthread 的多数情况是使用 pthread_mutex 互斥锁,性能较高。
NSThread:使用更加面向对象,简单易用,可直接操作线程对象,线程生命周期由程序员管理,偶尔使用。
GCD: 苹果公司为多核的并行运算提出的解决方案,纯C。会自动充分利用设备的多核。会自动管理线程的生命周期。
NSOperation:是 OC 语言中基于 GCD 的面向对象的封装
GCD
执行任务的方式
dispatch_sync:必须等待当前语句执行完毕,才会执行下一条语句(阻塞);在当前线程中执行任务,不具备开启新线程的能力。
dispatch_async:不用等待当前语句执行完毕,就可以执行下一条语句(不会阻塞);在新的线程中执行任务,具备开启新线程的能力。
队列
串行队列(DISPATCH _QUEUE _SERIAL) 以 FIFO 顺序处理传入的任务,即让任务一个接着一个执行。
并发队列(DISPATCH _QUEUE _CONCURRENT) 可以让多个任务并发(同时)执行(自动开启多个线程执行任务); 并发功能只有在异步函数dispatch_async下才有效; 尽管任务同时执行,但是您可以使用 barrier 栅栏函数在队列中创建同步点(关于栅栏函数后面会讲到)。
主队列(dispatch_queue_main_t) 主队列是一种特殊的串行队列,它特殊在与主线程关联,主队列的任务都在主线程上执行,主队列在程序一开始就被系统创建并与主线程关联。
顺序 & 优先级
1、如果用的是串行队列,那么队列里的任务会按照FIFO依次执行。
限制:必须是串行队列。
2、设置队列的优先级,优先级高的队列里的任务会优先执行。全局队列在创建时的第一个参数就是设置优先级。自定义队列可以使用dispatch_set_target_queue来设置优先级。
限制:必须在不用优先级的队列里。
3、同一个队列,且是并行队列,如何保证顺序
信号量:dispatch_semaphore_t
栅栏函数:dispatch_barrier_async
队列组: Dispatch Group 队列组