iOS

iOS GCD&&多线程

2018-11-11  本文已影响7人  浮生随笔

iOS GCD&&多线程

基础篇

GCD用途

GCD 是 Grand Central Dispatch 的缩写。

GCD 任务和队列

并发队列的并发功能只有在异步(dispatch_async)函数下才有效
如果并发队列再同步函数下,依旧会按顺序执行,并没能体现出并发功能

GCD 使用

GCD 步骤

  1. 创建队列(串行队列或者并行队列)
  2. 将任务追加到队列中

队列的创建

任务的创建

dispatch_sync(queue, ^{
    // 这里放同步执行任务代码
});
dispatch_async(queue, ^{
    // 这里放异步执行任务代码
});
区别 并发队列 串行队列 主队列
同步(sync) 当前线程,串行执行 当前线程,串行执行 死锁
异步(async) 能开辟新线程(多个),并发执行任务 新线程(一个)中执行,串行执行任务 为开辟新线程,串行执行任务

GCD 基本使用

任务按顺序执行的。按顺序执行的原因:虽然并发队列可以开启多个线程,并且同时执行多个任务。但是因为本身不能创建新线程,只有当前线程这一个线程(同步任务不具备开启新线程的能力),所以也就不存在并发。而且当前线程只有等待当前队列中正在执行的任务执行完毕之后,才能继续接着执行下面的操作(同步任务需要等待队列的任务执行结束)。所以任务只能一个接一个按顺序执行,不能同时被执行。

GCD 其他操作

栅栏函数

先执行barrier之前的任务,再执行barrier任务,最后执行barrier之后的任务

延时

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 2.0秒后异步追加任务代码到主队列,并开始执行
NSLog(@"after---%@",[NSThread currentThread]); // 打印当前线程
});


#### 一次性代码

* 一次性代码

    ```
 static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 只执行1次的代码(这里面默认是线程安全的)
    });

快速迭代

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    NSLog(@"apply---begin");
    dispatch_apply(6, queue, ^(size_t index) {
        NSLog(@"%zd---%@",index, [NSThread currentThread]);
    });\

队列组

dispatch_group_async
上一篇 下一篇

猜你喜欢

热点阅读