多线程:GCD

168 阅读1分钟

队列


  • 串行队列
  1. 主队列:
dispatch_queue_t queue =dispatch_get_main_queue();

2.自定义的串行队列:DISPATCH_QUEUE_SERIAL

dispatch_queue_t concurrentQueue = dispatch_queue_create("com.czw.downLoadQueue", DISPATCH_QUEUE_SERIAL);
  • 并行队列
  1. 全局并发队列:
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);

2.自定义并行队列:DISPATCH_QUEUE_CONCURRENT

dispatch_queue_t concurrentQueue = dispatch_queue_create("com.czw.downLoadQueue", DISPATCH_QUEUE_CONCURRENT);

基本使用


1.创建队列。

dispatch_queue_t concurrentQueue = dispatch_queue_create("com.czw.downLoadQueue", DISPATCH_QUEUE_CONCURRENT);

2.任务添加到队列,进行(同步或异步)执行。

dispatch_async(concurrentQueue, ^{
    //任务
}

GCD通信


dispatch_async(dispatch_get_global_queue(0,0), ^{
//1.1确定url
//1.2下载二进制数据到本地
//1.3转换图片

//更新UI
//dispatch_async(dispatch_get_main_queue(), ^{

});

异步处理任务,遇到UI更新操作是在主线程里完成。

一次性执行


 static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"任务执行了");
    });
1.只在程序运行期间执行一次。
2.block块内线程安全。
3.原理:通过判断onceToken=0来决定是否执行。

主要用在单例。

延迟执行


  • performSlector
[self performSelector:@selector(run) withObject:nil afterDelay:2];
  • NSTimer
[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(run) userInfo:nil repeats:NO];
  • GCD延迟执行:dispatch_after
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"任务执行了");
    });
//第二个参数:改变线程。
原理:先延迟时间,在把任务提交到队列执行。

控制线程个数


信号量机制

1.创建信号量

dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

2.降低信号量

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

3.提升信号量

dispatch_semaphore_signal(semaphore)

信号量类似锁的机制:信号量就是个阀门,降低信号量(阀门变低),水可以通过。

信号量控制并发数。相较于operationQueue,GCD稍显麻烦。

dispatch_queue_t workConcurrentQueue = dispatch_queue_create("czw", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t serialQueue = dispatch_queue_create("c",DISPATCH_QUEUE_SERIAL);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);

for (NSInteger i = 0; i < 10; i++) {
  dispatch_async(serialQueue, ^{
      dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
      dispatch_async(workConcurrentQueue, ^{
          NSLog(@"thread:%@开始执行任务%d",[NSThread currentThread],(int)i);
          sleep(1);
          NSLog(@"thread:%@结束执行任务%d",[NSThread currentThread],(int)i);
          dispatch_semaphore_signal(semaphore);});
  });
}

快速遍历


原理:开启多个线程,并发执行(放在并发队列才真正起作用。)

栅栏函数


dispatch_barrier_async:不能在全局并发队列使用

队列组


1.第一种方法。

dispatch_group_async
dispatch_group_notify

2.第二种方法。

dispatch_group_enter()
dispatch_group_leave()