//3 GCD(充分利用设备的多盒)-------------
屏蔽了线程,只能看见任务 队列
步骤两步,定制任务,将任务添加到队列。GCD将添加的任务,放到线程中去执行,自动执行,自动释放
原则:先进先出,先添加的任务先执行,有别于栈的先进后出,先添加的任务后执行

-------GCD---

GCD有两个用来执行任务的函数:同步函数,异步函数
同步:按顺序执行任务,同一条线程执行(不开线程)
异步:同时执行任务(开启新线程)

同步,异步,并发,串行
同步:当前线程执行,不具备开启新线程的能力
异步:在新线程执行,具备开启新线程的能力
并发:多个任务同时执行,
串行:一个任务执行完毕,在执行下一个任务

<1> 创建全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
注释:建立一个全局队列,优先级为默认(队列的调度频率为默认),后面默认0,苹果官方说明,以后可能会有用,
dispatch_async(queue,)^{
NSLog(@"---任务1---%@",[NSThread currentThread]);
}
dispatch_async(queue,)^{
NSLog(@"---任务2---%@",[NSThread currentThread]);
}
dispatch_async(queue,)^{
NSLog(@"---任务3---%@",[NSThread currentThread]);
}
分析:决定是否开启线程的是函数async,异步则开启新线程,全局队列属于并发队列,即为任务可以同时执行,则执行方案为,开启三条线程(非主线程的三条新线程),同时执行三个任务。
若函数为sync,即为同步函数,同步不会开启新线程(即在当前线程中执行任务),主队列的并发则失去意义,任务是依次执行的,so 和串行一样了

<2>创建串行队列
dispatch_queue_t queue = dispatch_queue_creat("NiuBiDe.queue",NULL);
注释:""中为串行队列的名称
dispatch_async(queue,)^{
NSLog(@"---任务1---%@",[NSThread currentThread]);
}
dispatch_async(queue,)^{
NSLog(@"---任务2---%@",[NSThread currentThread]);
}
dispatch_async(queue,)^{
NSLog(@"---任务3---%@",[NSThread currentThread]);
}
分析:async为异步函数,则会开启新线程,串行队列为非并发队列,则执行方案为开启新的线程 在这条线程中依次执行1,2,3任务
若为同步函数,则在主线程中依次执行三个任务

<3>创建主队列
dispatch_queue_t queue = dispatch_get_main_queue();
主队列是特殊的串行队列 无论同步异步都都会在主线程中执行任务
切忌:如果在主线程中执行同步方法会出现死锁现象,所以主线程中需用异步主队列执行任务操作
应用:多用于处理耗时操作的子线程中 处理UI显示问题,创建主线程 异步显示UI之用

GCD总结:

dispatch_async(sync)(全局队列/主队列/串行队列)block^{
}

表格----
全局队列 串行队列 主队列

同步 不开启新线程 不开启新线程 不开启新线程
任务串行执行 任务串行执行 串行执行任务

异步 开启线程 开启线程 不开启线程
任务并发执行 任务串行执行 任务串行执行

其他用法:
- 延迟调用
对比 [self performSelected:@selected(run)withObject:nil afterDealy:2.0];当前线程延迟2.0秒调用run方法

dispatch_after(DISPATCH_TIME_NOW,(int64_t)(3.0* NSEC_PER_SEC),dispatch_get_main_queue()))^{

}
注释:dispatch_get_main_queue()即为在主队列中执行延迟操作,如果换成
全局队列则会在其他线程中执行操作!~ 牛B!~

- 一次性代码
dispatch_once ^{
}
注释:保证在整个程序运行中此代码只执行一次!~

- 队列组(神奇!~)
应用场景:当两个耗时操作都完成后,才操作UI显示,两个图片下载完毕后,合并显示在UI上

//创建队列组
dispatch_group_t group = dispatch_group_creat();

//开启下载任务1
dispatch_group_async(group,global_queue,^{
//还是操作1
})];

//开启下载任务2
dispatch_group_async(group,global_queue,^{
//还是操作2
})];

//等gruop中的任务都执行完毕,在执行其他操作
dispatch_group_notify(group,main_queue^{

//在主线程中,处理显示UI细节。
})];

最新文章

  1. AE开发中对GDB以及shapefile的读取、对FeatureClass的相关操作
  2. Hive几种数据导出方式
  3. Android 采用Layout Inflater创建一个View对象
  4. JS中使用EL表达式
  5. 收藏本网站兼容火狐IE
  6. ActionContext详解
  7. python 自定义函数
  8. Web分析日志分析2
  9. Android学习之DialogFragment
  10. Hibernate操作Clob数据类型
  11. 定时器Timer不定时
  12. Java豆瓣电影爬虫——模拟登录的前世今生与验证码的爱恨情仇
  13. Maven服务器搭建
  14. 初识C语言(一)
  15. RESTful学习笔记
  16. J2EE十三个技术规范
  17. 【精】EOS智能合约:system系统合约源码分析
  18. 用Python读写Excel文件的方式比较
  19. hdu 1372 骑士从起点走到终点的步数 (BFS)
  20. java 注解的使用

热门文章

  1. mysql-mysql悲观锁和乐观锁
  2. Javascript高级程序设计——面向对象之实现继承
  3. android Home键和返回键
  4. HNU 12868 Island (简单题)
  5. SSH如何通过公钥连接云服务器
  6. phpcms 搜索结果页面栏目不显示解决 方法
  7. hiho #1326 : 有序01字符串
  8. php类与对象
  9. backbone调试
  10. phpcms不显示验证码