1>GCD,全称Grand Central Dispatch,”牛逼的中枢调度器”,纯C语言,提供了非常多强大的函数
2>GCD优势:
(1)GCD是苹果公司为多核的并行运算提出的解决方案
(2)GCD会自动利用更多地CPU内核(双核,四核等)
(3)GCD会自动管理线程的生命周期(创建线程,调度任务,销毁线程)
(4)程序员只需告诉GCD想要执行什么任务,不需要编写任何线程管理代码
3>任务和队列
GCD中2个核心概念:
任务:执行什么操作
队列:用来存放任务
GCD使用2个步骤:
(1)定制任务:确定想做得事情
(2)将任务添加到队列中:
    GCD会自动将队列中的任务取出,放到对应的线程中执行
    任务的取出遵循队列的FIFO原则:先进先出,后进后出
4>GCD中有2个用来执行任务的函数
(1)同步方式执行任务
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
queue:队列
block:任务
(2)异步方式执行任务
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
(1),(2)区别:同步在当前线程中执行;异步在另一条线程中执行
5>GCD的队列分为2大类型
(1)并发队列
    可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)
    并发功能只有在异步(dispatch_async)函数下才有效
创建方法:
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
(2)串行队列
    让任务一个戒指一个的执行(一个任务执行完毕后,再执行下一个任务)
创建串行有两种途径:
    使用dispatch_queue_create函数创建
    dispatch_queue_t   queue=dispatch_queue_create(“cn.xxoo.queue”,NULL);
    dispatch_release(queue);//非ARC需要手动释放创建的队列
    使用主队列dispatch_get_main_queue:
    *放入主队列中的任务,队徽放到主线程中执行
    dispatch_queue_t queue=dispatch_get_main_queue();

6>各种队列的执行效果

7>线程间通信示例:
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
    //执行耗时的异步操作
    dispatch_async(dispatch_get_main_queue(),^{
        //回到主线程,执行UI刷新操作
    });
});

8>延时执行
(1)调用NSObject的方法
    [self performSelector:@selector(run) withObject:nil afterDelay:2.0];
//2秒后再调用self的run方法
(2)使用GCD函数
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(2.0*NSEC_PER_SEC)),dispatch_get_main_queue(),^{
    //2秒后异步执行这里的代码...
});

9>一次性代码
使用dispatch_once函数能保证某段代码在程序运行过程中只被执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    //只执行1次的代码(这里默认是线程安全的)
});

10>队列组

有这样一种需求:
首先:分别异步执行2个耗时操作
其次:等2个异步操作都执行完毕后,再回到主线程执行操作
这时可以考虑使用队列组(高效快速地实现)

dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

//执行第一个耗时的异步操作
});

dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

//执行第二个耗时的异步操作
});

dispatch_group_notify(group,dispatch_get_main_queue(),^{
    //等前面的异步操作都执行完毕后,回到主线程...
});

最新文章

  1. 转载文章-----Rational Rose2007(v7.0)下载地址、安装及激活详解教程(图)
  2. csuoj 1391: Boiling Vegetables
  3. POJ 3728
  4. DownloadManager补漏
  5. 今天想用jquery来实现div的拖放功能
  6. keepalived对nginx高可用演练脚本
  7. ABCpdf.NET中Rect,Bottom,Height的关系
  8. webservice的讲解
  9. AFNetworking 3.0x版本最新特性
  10. 总结NAND FLASH控制器的操作
  11. url地址栏拼接参数写法
  12. 开机后发现Win7桌面上什么都没有该如何恢复
  13. Java NIO 学习总结 学习手册
  14. Java-Maven(一):Maven的简介与安装
  15. .NET CORE学习笔记系列(2)——依赖注入[6]: .NET Core DI框架[编程体验]
  16. 打印word文档时遇到标记区如何取消
  17. [Shiro] tutorial 1 :SecurityManager and Subject
  18. HTML表格布局
  19. Solr 7.7.0 部署到Tomcat
  20. MTK 关闭耳机调至最大音量时,提示损伤听力

热门文章

  1. Cyclomatic complexity
  2. mybatis一对一关联表查询
  3. GraphLab:新的面向机器学习的并行框架
  4. Linux远程连接与常用命令
  5. JAVA GUI学习 - JList列表、JScrollPane滚动条组件学习
  6. Hierarchical Storage structure
  7. Linux内核启动代码分析二之开发板相关驱动程序加载分析
  8. 最长回文(Manacher)
  9. hdu4370 0 or 1【最短路+建图】
  10. 利用CSS、JavaScript及Ajax实现图片预加载的三大方法(转)