IOS 之 GCD线程 心得总结
来源:互联网 发布:整容软件app 编辑:程序博客网 时间:2024/06/05 20:06
一、什么是GCD?
Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写。从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。GCD比之NSOpertionQueue更底层更高效,并且它不是Cocoa框架的一部分。
除了代码的平行执行能力,GCD还提供高度集成的事件控制系统。可以设置句柄来响应文件描述符、mach ports(Mach port 用于 OS X上的进程间通讯)、进程、计时器、信号、用户生成事件。这些句柄通过GCD来并发执行。
GCD的API很大程度上基于block,当然,GCD也可以脱离block来使用,比如使用传统c机制提供函数指针和上下文指针。实践证明,当配合block使用时,GCD非常简单易用且能发挥其最大能力。
你可以在Mac上敲命令“man dispatch”来获取GCD的文档。
二、GCD优势
GCD提供很多超越传统多线程编程的优势:
- 易用: GCD比之thread跟简单易用。由于GCD基于work unit而非像thread那样基于运算,所以GCD可以控制诸如等待任务结束、监视文件描述符、周期执行代码以及工作挂起等任务。基于block的血统导致它能极为简单得在不同代码作用域之间传递上下文。
- 效率: GCD被实现得如此轻量和优雅,使得它在很多地方比之专门创建消耗资源的线程更实用且快速。这关系到易用性:导致GCD易用的原因有一部分在于你可以不用担心太多的效率问题而仅仅使用它就行了。
- 性能: GCD自动根据系统负载来增减线程数量,这就减少了上下文切换以及增加了计算效率。
三、GCD语音
1、Dispatch Objects
尽管GCD是纯c语言的,但它被组建成面向对象的风格。GCD对象被称为dispatch object。Dispatch object像Cocoa对象一样是引用计数的。使用dispatch_release和dispatch_retain函数来操作dispatch object的引用计数来进行内存管理。但主意不像Cocoa对象,dispatch object并不参与垃圾回收系统,所以即使开启了GC,你也必须手动管理GCD对象的内存。
Dispatch queues 和 dispatch sources(后面会介绍到)可以被挂起和恢复,可以有一个相关联的任意上下文指针,可以有一个相关联的任务完成触发函数。可以查阅“man dispatch_object”来获取这些功能的更多信息。
2、Dispatch Queues
GCD的基本概念就是dispatch queue。dispatch queue是一个对象,它可以接受任务,并将任务以先到先执行的顺序来执行。dispatch queue可以是并发的或串行的。并发任务会像NSOperationQueue那样基于系统负载来合适地并发进行,串行队列同一时间只执行单一任务。
GCD中有三种队列类型:
- The main queue: 与主线程功能相同。实际上,提交至main queue的任务会在主线程中执行。main queue可以调用dispatch_get_main_queue()来获得。因为main queue是与主线程相关的,所以这是一个串行队列。
- Global queues: 全局队列是并发队列,并由整个进程共享。进程中存在三个全局队列:高、中(默认)、低三个优先级队列。可以调用dispatch_get_global_queue函数传入优先级来访问队列。
- 用户队列: 用户队列 (GCD并不这样称呼这种队列, 但是没有一个特定的名字来形容这种队列,所以我们称其为用户队列) 是用函数
dispatch_queue_create
创建的队列。正因为如此,它们可以用来完成同步机制, 有点像传统线程中的mutex。
dispatch_queue_t serialQueue = dispatch_queue_create("com.oukavip.www",NULL); // 当不声明队列类型时,可以设置优先级
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
dispatch_set_target_queue(serialQueue, globalQueue);// 第一个参数为要设置优先级的queue,第二个参数是参照物,既将第一个queue的优先级和第二个queue的优先级设置一样。
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, ^{
[NSThreadsleepForTimeInterval:6];
NSLog(@"group1 [NSThread sleepForTimeInterval:6];");
});
dispatch_group_async(group, queue, ^{
[NSThreadsleepForTimeInterval:3];
NSLog(@"group2 [NSThread sleepForTimeInterval:3];");
});
dispatch_group_async(group, queue, ^{
[NSThreadsleepForTimeInterval:1];
NSLog(@"group3 [NSThread sleepForTimeInterval:1];");
});
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
NSLog(@"等待全面执行完才执行");
});
dispatch_once这个函数,它可以保证整个应用程序生命周期中某段代码只被执行一次!
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// code to be executed once });
本文参考自: http://blog.csdn.net/crycheng/article/details/22214617、http://blog.csdn.net/wildfireli/article/details/18668897,并对改文进行了补充说明。
- IOS 之 GCD线程 心得总结
- IOS之线程(GCD)
- iOS线程之GCD
- iOS - GCD 之线程死锁
- IOS-线程操作之NSThread/NSOperation/GCD
- iOS 线程之GCD的高级用法
- iOS 开发之多线程之GCD
- ios多线程学习之GCD线程锁
- iOS多线程之线程安全和GCD
- IOS多线程之——GCD总结。
- 转载:iOS开发之GCD使用总结
- iOS多线程之GCD-NSOperation对比总结
- iOS开发之GCD使用总结
- iOS开发之GCD使用总结
- iOS多线程之GCD术语总结
- 总结一下iOS的并发---之GCD
- iOS开发之GCD使用总结
- dispatchc 线程 GCD iOS
- 今天,我赚了
- 基于zookeeper+leveldb搭建activemq集群
- Centos6.5搭建java开发环境
- android初学之Android异常之 Warning: Activity not started, its current task has been brought to the front
- repo sync 遇到问题
- IOS 之 GCD线程 心得总结
- vs2005中在对话框中添加浏览网页控件及使用
- c++异常处理机制
- UGUI 之 判断鼠标或者手指是否点击在UI上
- Ext.js5表单—验证vtype扩展(时间段以及密码确认)(50)
- 关于TextView的跑马灯滚动方式
- Odoo的安装
- 学习资源
- 将MongoDB导出成csv文件