戴远的IT博客 首页 阅读

GCD总结

在iOS中实现线程的几种方法

GCD介绍

Grand Central Dispatch(GCD)是异步执行任务的技术之一。开发者只需要定义想执行的任务并追加到适当的 Dispatch Queeu中,GCD就能生成必要的线程并计划执行任务。

GCD比以前的线程更有效率,因为它是作为系统的一部分来实现的。

dispatch_async(queue, ^{
  /*
    长时间处理的任务
  */

  dispatch_async(dispatch_get_main_queue(), ^{
    // 在主线程中执行的处理,例如更新用户界面
  })
})

GCD API

使用GCD,你只需要定义想执行的任务并追加到适当的Dispatch Queue中。

例如:

dispatch_async(queue, ^{
  // 想执行的任务
})

Dispatch Queue

什么是“Dispatch Queue”?是执行处理的等待队列。按照追加的顺序(FIFO,先进先出)执行处理。

Queue分为两种:

下面的图直观的展示了这两种队列的区别:

a

创建队列

// 创建serial queue
dispatch_queue_t myQueue = dispatch_queue_create("com.sl.gcd.queue",NULL);

// 创建concurrent queue
dispatch_queu myConcurrentQueue = dispatch_queue_create("com.sl.gcd.concurrentqueue",DISPATCH_QUEUE_CONCURRENT);

// 创建的concurrent queue需要释放
dispatch_release(myConcurrentQueue);
// Main Dispatch Queue 主线程队列,由于主线程就一个,所以这个队列是serial队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();

// Global Dispatch Queue,该队列是concurrent队列
dispatch_queue_t globalDispatchQueue = dispatch_get_global_queue();

dispatch_after

在指定的时长之后执行任务

dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ULL * NSEC_PER_SEC);
dispatch_after(time, dispatch_get_main_queue(), ^{
  // 任务会在3秒后执行
})

dispatch_once

dispatch_once是保证在app执行中只执行一次指定的处理。

例如:

static int ini = NO;
if(ini == NO) {
  // 初始化
  ini = YES;
}

这段代码在大部分情况下会很好地执行,但是在多核CPU下,会出问题。此时,就需要用dispatch_once来解决多线程情况下地代码问题。

static dispatch_once_t pred;

dispatch_once(&pred, ^{
  // 初始化
});

dispatch group

如何在多有任务执行完成后,执行某个任务? 对于serial队列,只需要把任务放在所有任务之后即可。对于concurrent队列,情况比较复杂,需要用到dispatch_group。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ NSLog(@"1"); });
dispatch_group_async(group, queue, ^{ NSLog(@"2"); });
dispatch_group_async(group, queue, ^{ NSLog(@"3"); });

dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"done");});
dispatch_release(group);

队列的挂起和恢复

dispatch_suspend(queue);
dispatch_resume(queue);
--EOF--
若无特别说明,本站文章均为原创,转载请保留[链接]