GCD总结(一)
串行(Serial)

1 UInt32 loopCount = 1000;
2
3 void (^taskFirst)(void) = ^{
4 NSLog(@"taskFirst 任务开始执行\r\n");
5
6 for (UInt32 i = 0; i < loopCount; i++) {
7
8 }
9 NSLog(@"taskFirst 任务结束\r\n");
10 };
11
12 void (^taskSecond)(void) = ^{
13 NSLog(@"taskSecond任务开始执行\r\n");
14 for (UInt32 i = 0; i < loopCount; i ++) {
15
16 }
17 NSLog(@"taskSecond 任务结束\r\n");
18 };
19 dispatch_queue_t serialQueue;
20 serialQueue = dispatch_queue_create("serialDemo", NULL);
21 dispatch_async(serialQueue, taskFirst);
22 NSLog(@"taskfirst 已经加入队列\r\n");
23 dispatch_async(serialQueue, taskSecond);
24 NSLog(@"tasksecond 已经加入队列\r\n");

运行得到结果1:
2012-05-14 18:45:01.766 GDCDemo[389:f803] taskfirst 已经加入队列
2012-05-14 18:45:01.766 GDCDemo[389:11103] taskFirst 任务开始执行
2012-05-14 18:45:01.767 GDCDemo[389:f803] tasksecond 已经加入队列
2012-05-14 18:45:01.768 GDCDemo[389:11103] taskFirst 任务结束
2012-05-14 18:45:01.768 GDCDemo[389:11103] taskSecond任务开始执行
2012-05-14 18:45:01.772 GDCDemo[389:11103] taskSecond 任务结束
运行结果跟我们的预计一样,taskFirst执行完之后,才执行taskSecond。而且,通过“xxx任务加入队列”的提示,任务运行的线程跟主线程不是同一个。
下面,我们继续对代码做点调整,让它演示不同队列之间的任务并行运行。

1 UInt32 loopCount = 1000;
2 UInt32 loopCountFirst = 10000000;
3
4 void (^taskFirst)(void) = ^{
5 NSLog(@"taskFirst 任务开始执行\r\n");
6
7 //延长taskFirst的运行时间
8 for (UInt32 i = 0; i < loopCountFirst; i++) {
9
10 }
11 NSLog(@"taskFirst 任务结束\r\n");
12 };
13
14 void (^taskSecond)(void) = ^{
15 NSLog(@"taskSecond任务开始执行\r\n");
16 for (UInt32 i = 0; i < loopCount; i ++) {
17
18 }
19 NSLog(@"taskSecond 任务结束\r\n");
20 };
21 dispatch_queue_t serialQueue;
22 serialQueue = dispatch_queue_create("serialDemo", NULL);
23 //创建第二个队列
24 dispatch_queue_t serialQueueSecond = dispatch_queue_create("serialSecondDemo", NULL);
25 dispatch_async(serialQueue, taskFirst);
26 NSLog(@"taskfirst 已经加入队列\r\n");
27 dispatch_async(serialQueueSecond, taskSecond);
28 NSLog(@"tasksecond 已经加入队列\r\n");

运行得到结果2:
2012-05-14 19:07:22.951 GDCDemo[456:f803] taskfirst 已经加入队列
2012-05-14 19:07:22.951 GDCDemo[456:11103] taskFirst 任务开始执行
2012-05-14 19:07:22.953 GDCDemo[456:f803] tasksecond 已经加入队列
2012-05-14 19:07:22.953 GDCDemo[456:12c03] taskSecond任务开始执行
2012-05-14 19:07:22.954 GDCDemo[456:12c03] taskSecond 任务结束
2012-05-14 19:07:22.977 GDCDemo[456:11103] taskFirst 任务结束
由此可见,taskSecond是添加到队列后立即执行的。两个串行队列之间的任务是互不影响的。
并行(Concurrent)
1 dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2 dispatch_async(concurrentQueue, taskFirst);
3 NSLog(@"taskfirst 已经加入队列\r\n");
4 dispatch_async(concurrentQueue, taskSecond);
5 NSLog(@"tasksecond 已经加入队列\r\n");
运行,结果与结果2相同。说明了,taskFirst和taskSecond是同时运行的。
主调度队列(main dispatch queue)
dispatch_async(dispatch_get_main_queue(), ^{
.....//跟新界面的操作
});
GCD总结(一)的更多相关文章
- Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用
OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...
- iOS 多线程之GCD的使用
在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...
- 【swift】BlockOperation和GCD实用代码块
//BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...
- 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...
- GCD的相关函数使用
GCD 是iOS多线程实现方案之一,非常常用 英文翻译过来就是伟大的中枢调度器,也有人戏称为是牛逼的中枢调度器 是苹果公司为多核的并行运算提出的解决方案 1.一次性函数 dispatch_once 顾 ...
- hdu1695 GCD(莫比乌斯反演)
题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...
- hdu2588 GCD (欧拉函数)
GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数. (文末有题) 知 ...
- BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】
2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1624 Solved: 853[Submit][Status][Discu ...
- BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4436 Solved: 1957[Submit][Status][Discuss ...
- GCD总结
//用block只有两种:同步执行/异步执行(参数1:队列;参数二:任务) dispatch_async(dispatch_get_global_queue(0, 0),^{ });//异步在新的线程 ...
随机推荐
- Spider-Python爬虫之使用Selenium模拟浏览器行为
分析 他的代码比较简单,主要有以下的步骤:使用BeautifulSoup库,打开百度贴吧的首页地址,再解析得到id为new_list标签底下的img标签,最后将img标签的图片保存下来. header ...
- 88-On Balance Volume 能量潮指标.(2015.7.4)
On Balance Volume 能量潮指标 ~计算方法: 如果当天的收盘价高于昨天的话,那么:OBV(i) = OBV(i-1)+VOLUME(i) 如果当天的收盘价低于昨天的话,那么:OBV(i ...
- Mysql学习总结(43)——MySQL主从复制详细配置
环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso MySQL版本:mysql-5.6.26.tar.gz 主节点IP:192.168.1.205 主机名:edu-mysql ...
- Android RoundedBitmapDrawable:Android官方的圆角图形图象实现方案
Android RoundedBitmapDrawable:Android官方的圆角图形图象实现方案 RoundedBitmapDrawable是Android在support v4的扩展包中新 ...
- Jquery根据JSON生成Table
先说下背景 本人属于juqery小白中的极品小白.基本对于JS jquery这些不懂.用到时候基本百度下 拿过来改改OK. 上面这东西让我弄了三天.可能对于其他人来说 一天就搞定了 .看来还真得去学一 ...
- AOJ -0033 Ball(DFS)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=22516 一道需要思考的搜索题. 题意:十个球按给定顺序从图中所示容器中下落, ...
- openstack setup demo Identity service
openstack Identity service 名叫keystone.它提供了用户校验,以及服务目录查询(即列出所有的服务以及相关信息)等功能. keystone 主要包含以下几个部分 Serv ...
- 智能眼镜技术科普:VR、AR、MR的区别
前段时间, 获得谷歌5亿美元融资的技术公司Magic Leap在WSJD展会中放出了一段实录视频,引起不小骚动.如今,也有媒体称他们为MR公司,那么VR.AR.MR之间到底有什么区别呢. VR.AR. ...
- win7开启超级管理员账户(Administrator)
win7开启超级管理员账户(Administrator) 不同于XP系统,Windows7系统据说出于安全的考虑,将超级管理员帐户"Administrator"在登陆界面给隐藏了, ...
- android的ListView点击item使item展开的做法
直接上代码把.主要是又一次给item measure高度,直接上代码把 import java.util.ArrayList; import android.app.Activity; import ...