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),^{ });//异步在新的线程 ...
随机推荐
- 五段实用的js高级技巧
技巧一之setTimeout. 应用案例:比如你想一个函数循环执行10次,怎么办?以前通常是先setInterval,然后clearInterval,技巧一就是克服这个问题 复制代码 代码如下: (f ...
- Rightmost Digit (求n^n最后一位)
Description Given a positive integer N, you should output the most right digit of N^N. Input The ...
- 标准sqlserver连接语句
sqlserver左右全内连接 原始链接http://www.cnblogs.com/youzhangjin/archive/2009/05/22/1486982.html 连接条件可在FR ...
- 接口测试工具-fiddler的运用
本篇主要介绍一下fiddler的基本运用,包括查看接口请求方式,状态响应码,如何进行接口测试等 一.Fiddler的优点 独立的可以直接抓http请求 小巧.功能完善 快捷.启动就行 代理方便 二.什 ...
- 九度oj 题目1206:字符串连接
题目1206:字符串连接 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:5117 解决:2373 题目描述: 不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来 ...
- ABC077翻车实况
今天强行打一波ABC,想作为信心赛,然而= = T1 日常练习读入&输出 T2 $STL$大法好,$sqrt$保平安,我强行递推$WA$了一圈,然后罚时++ T3 woc好难啊,$n=1 ...
- 【BZOJ2330】糖果(差分约束系统,强连通分量,拓扑排序)
题意: 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖 ...
- Ubuntu12.04之修改密码
Ubuntu 12.04 默认root没有密码 修改密码方式如下: test@localhost:~$ sudo passwd root [sudo] password for test: 输入新的 ...
- kibana启动--nohup在关闭终端后无效&&守护进程详解
https://blog.csdn.net/ty_0930/article/details/70184705 https://blog.csdn.net/Dream_Flying_BJ/article ...
- IDEA新手下载及和eclipse,myeclipse的区别
一:下载安装包,我们可以去官网下载.下载地址:http://www.jetbrains.com/idea/download/#secation=windows 二:IDEA的安装: 1.下载安装包后双 ...