GCD 英文全称 Grand Central Dispatch 是苹果为多核的并行运算提出的解决方案,所以会自动合理地利用更多的CPU内核(比如双核、四核),最重要的是它会自动管理线程的生命周期(创建线程、调度任务、销毁线程),完全不需要我们管理,我们只需要告诉干什么就行。同时它使用的也是 c语言,不过由于使用了 Block(Swift里叫做闭包),使得使用起来更加方便,而且灵活。
任务和队列
GCD中两个重要的概念 任务 和 队列。
任务 即操作,你想要干什么,说白了就是一段代码,在 GCD 中就是一个 Block,所以添加任务十分方便。任务有两种执行方式: 同步执行 和 异步执行。
同步(sync) 和 异步(async) 的主要区别在于会不会阻塞当前线程,直到 Block 中的任务执行完毕!
如果是 同步(sync) 操作,它会阻塞当前线程并等待 Block 中的任务执行完毕,然后当前线程才会继续往下运行。
队列 用于存放任务。一共有两种队列, 串行队列 和 并行队列
串行队列 中的任务会根据队列的定义 FIFO 的执行,一个接一个的先进先出的进行执行。
并行队列 GCD 也会 FIFO的取出来,但不同的是,它取出来一个就会放到别的线程,然后再取出来一个又放到另一个的线程。这样由于取的动作很快,忽略不计,看起来,所有的任务都是一起执行的。不过需要注意,GCD 会根据系统资源控制并行的数量,所以如果任务很多,它并不会让所有任务同时执行
主队列 这是一个特殊的 串行队列,用于刷新 UI,任何需要刷新 UI 的工作都要在主队列执行,所以一般耗时的任务都要放到别的线程执行。
//主队列
dispatch_queue_t queue = dispatch_get_main_queue();
//串行队列
dispatch_queue_t queue = dispatch_queue_create("asdasda", NULL);
dispatch_queue_t queue = dispatch_queue_create("1231ad", DISPATCH_QUEUE_SERIAL);
//并行队列
dispatch_queue_t queue = dispatch_queue_create("123123124as", DISPATCH_QUEUE_CONCURRENT);
//全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//同步任务
dispatch_sync(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
//异步任务
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});