并发所描述的概念就是同时运行多个任务。这些任务可能是以在单核 CPU 上分时(时间分享)的形式同时运行,也可能是在多核 CPU 上以真正的并行方式来运行。这篇文章是作者在学习iOS开发技术当中,遇到多线程问题时捋顺思路时的一些看法。
GCD是iOS开发当中解决多核开发的一个技术。
主要有三种队列:一、运行在主线程的 Main queque 通过dispatch_get_main_queque 来获取
二、并行队列 global dispatch queque ,通过dispatch_get_global_queque 获取。并行队列的优先级 有 high ,default , low。
三、串行队列 serial queues一般用于按顺序同步访问,可创建任意数量的串行队列,各个串行队列之间是并发的。当想要任务按照某一个特定 的顺序执行时,串行队列是很有用的。串行队列在同一个时间只执行一个任务。我们可以使用串行队列代替锁去保护共享的数据。和锁不 同,一个串行队列可以保证任务在一个可预知的顺序下执行。
serial queues通过dispatch_queue_create创建,可以使用函数dispatch_retain和dispatch_release去增加或者减少引用计数。
一:问题描述: 取一段字符串,将其全部转换成大写 ,然后计算该字符串的长度以及替换部分字符。Demo的目的是:求得多线程技术能减少具体的运行时间是多少,展现正确使用多线程技术能极大提高代码执行效率。
二:问题分析: 首先要获取一段字符串,这个任务应该是最先完成的。将该字符串全部转换成大写,计算长度,替换相关位置 三个动作是互不相关的 。因此前后两者有顺序关系 应做成串行队列 ,三个动作分成并行队列。
三:测试结果对比:
图1 (使用GCD技术)
图2(未使用GCD)
首先将两种不同方法(多线程与非多线程)所花费的时间进行比较 :图1使用GCD技术实现Demo花费时间 : 图2使用非GCD技术实现Demo花费时间 = 1:10 。
由此一小段代码前后运行时间的恐怖差别,对多线程提高代码执行效率可见一斑。
图3(GCD)
注意:1,block块变量的作用域范围
2,分组的三个动作 处理的对象都是fetchData ,这一点必须把握清楚。并行队列里是随机执行的,因此将三个动作(转换大写,计算长度,替换字符)放在同一组当中,不见得先执行第一个 ,
在测试Demo的时候,因为是先写的非GCD情况 当重构代码的时候 ,我并没有将两个(计算长度 替换字符)方法处理的对象从handleData(转换大写)改fetchData(数据),也就说并没有完全理解 并列队列的执行顺序 以为也会是顺序执行 三个同一级别的有两个是依赖第一个的处理结果 ,出现了逻辑上的错误。
3,整个页面的刷新显示 ,应该是放在主线程中进行。
图4(非GCD)
注: 基本的顺序执行。
//以上内容有参照 http://objccn.io/issue-2-1/