iOS多线程——GCD
2015-08-20 11:58
501 查看
[iOS多线程——GCD]
GCD —— Grand Central Dispatch
(1).是基于C语言的底层API
(2).用Block定义任务,使用起来非常灵活便捷
(3).提供了更多的控制能力以及操作队列中所不能使用的底层函数
GCD的基本思想是就将操作s放在队列s中去执行
(1)操作使用Blocks定义
(2)队列负责调度任务执行所在的线程以及具体的执行时间
(3)队列的特点是先进先出(FIFO)的,新添加至对列的操作都会排在队尾
提示
GCD的函数都是以dispatch(分派、调度)开头的
队列
dispatch_queue_t
串行队列,队列中的任务只会顺序执行
并行队列,队列中的任务通常会并发执行
操作
dispatch_async异步操作,会并发执行,无法确定任务的执行顺序
dispatch_sync同步操作,会依次顺序执行,能够决定任务的执行顺序
串行队列
全局队列
主队列
GCD阶段性小结
GCD
(1)通过GCD,开发者不用再直接跟线程打交道,只需要向队列中添加代码块即可
(2)GCD在后端管理着一个线程池,GCD不仅决定着代码块将在哪个线程被执行,它还根据可用的系统资源对这些线程进行管理。从而让开发者从线程管理的工作中解放出来,通过集中的管理线程,缓解大量线程被创建的问题
(3)使用GCD,开发者可以将工作考虑为一个队列,而不是一堆线程,这种并行的抽象模型更容易掌握和使用
GCD的队列
(1)GCD公开有5个不同的队列:运行在主线程中的主队列,3个不同优先级的后台队列,以及一个优先级更低的后台队列(用于I/O)
(2)自定义队列:串行和并行队列。自定义队列非常强大,建议在开发中使用。在自定义队列中被调度的所有Block最终都将被放入到系统的全局队列中和线程池中
(3)提示:不建议使用不同优先级的队列,因为如果设计不当,可能会出现优先级反转,即低优先级的操作阻塞高优先级的操作
GCD —— Grand Central Dispatch
(1).是基于C语言的底层API
(2).用Block定义任务,使用起来非常灵活便捷
(3).提供了更多的控制能力以及操作队列中所不能使用的底层函数
GCD的基本思想是就将操作s放在队列s中去执行
(1)操作使用Blocks定义
(2)队列负责调度任务执行所在的线程以及具体的执行时间
(3)队列的特点是先进先出(FIFO)的,新添加至对列的操作都会排在队尾
提示
GCD的函数都是以dispatch(分派、调度)开头的
队列
dispatch_queue_t
串行队列,队列中的任务只会顺序执行
并行队列,队列中的任务通常会并发执行
操作
dispatch_async异步操作,会并发执行,无法确定任务的执行顺序
dispatch_sync同步操作,会依次顺序执行,能够决定任务的执行顺序
串行队列
<span style="font-size:12px;">//1.创建队列 //demoqueue 队列名称,在调试时辅助 dispatch_queue_t q = dispatch_queue_create("demoqueue", DISPATCH_QUEUE_SERIAL); //同步操作。不会新建线程(没用) dispatch_sync(q, ^{ NSLog(@"串行同步 %@", [NSThread currentThread]); }); //异步操作。会新建线程。(非常有用) //场景:既不影响主线程,又需要顺序执行的操作 dispatch_async(q, ^{ NSLog(@"串行异步 %@", [NSThread currentThread]); });</span><span style="font-size: 32pt;"> </span>并行队列
//1.创建并行队列 dispatch_queue_t q = dispatch_queue_create("demoqueue", DISPATCH_QUEUE_CONCURRENT); //同步操作不会新建线程、操作顺序执行 dispatch_sync(q, ^{ NSLog(@"并行同步 %@", [NSThread currentThread]); }); //异步操作会新建多个线程,操作无序执行(有用但容易出错) dispatch_async(q, ^{ NSLog(@"并行异步 %@", [NSThread currentThread]); });
全局队列
<span style="font-size:12px;">//1.全局队列是系统的,直接拿过来(GET)用就可以 dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //异步会新建多个线程、操作无序执行 dispatch_async(q, ^{ NSLog(@"全局异步 %@ %d", [NSThread currentThread], i); }); //同步操作不会新建线程、操作顺序执行 dispatch_sync(q, ^{ NSLog(@"全局同步 %@ %d", [NSThread currentThread], i); });</span>
主队列
//1.每一个应用程序对应唯一主队列,直接GET得到 //在多线程开发中,使用主队列更新UI dispatch_queue_t q = dispatch_get_main_queue(); //主队列中的操作都应该在主线程上顺序执行的,不存在异步的概念 dispatch_async(q, ^{ NSLog(@"主队列异步 %@", [NSThread currentThread]); }); //主队列添加的同步操作永远不会被执行,会死锁 dispatch_sync(q, ^{ NSLog(@"主队列同步 %@", [NSThread currentThread]); });
GCD阶段性小结
GCD
(1)通过GCD,开发者不用再直接跟线程打交道,只需要向队列中添加代码块即可
(2)GCD在后端管理着一个线程池,GCD不仅决定着代码块将在哪个线程被执行,它还根据可用的系统资源对这些线程进行管理。从而让开发者从线程管理的工作中解放出来,通过集中的管理线程,缓解大量线程被创建的问题
(3)使用GCD,开发者可以将工作考虑为一个队列,而不是一堆线程,这种并行的抽象模型更容易掌握和使用
GCD的队列
(1)GCD公开有5个不同的队列:运行在主线程中的主队列,3个不同优先级的后台队列,以及一个优先级更低的后台队列(用于I/O)
(2)自定义队列:串行和并行队列。自定义队列非常强大,建议在开发中使用。在自定义队列中被调度的所有Block最终都将被放入到系统的全局队列中和线程池中
(3)提示:不建议使用不同优先级的队列,因为如果设计不当,可能会出现优先级反转,即低优先级的操作阻塞高优先级的操作
相关文章推荐
- IOS开发 - IOS程序的完整启动过程
- IOS开发 - AppDelegate的代理方法
- iOS基础知识点
- ios-控件的初始化
- zabbix监控磁盘IO low-level-discory方式-iostat说明
- ios Mantle使用小记
- iOS-Core Animation学习-1 position Animation
- iOS项目开发实战——制作视图的旋转动画
- Nagios:企业级系统监控方案
- iOS企业证书申请
- iOS动态类型和动态绑定
- iOS几种蓝牙模块
- iOS中常见的几种存储方式
- 我的iOS工程结构
- iOS开发之MVC
- ios各种编译安装错误
- IOS学习计划
- ios 清理缓存
- iOS 的几种模式
- iOS 苹果地图 MKMapView总结