iosGCD的简单介绍2

今天风超大的,把我人都快吹走了,但是我还是回来来。。。啦啦啦,长话短说,下面为大家准备了GCD的深入了解。大家可以复制到自己的Xcode里面运行下了。然后仔细看看这些介绍,多敲几遍。其实很简单的,一个并发 一个串行队列。。。就像我们走路一样,3个人走一排角并发  ,把3个人拍好队一个个走,就是串行队列。。哈哈,是不是很有意思呢?

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

[super
viewDidLoad];

//------------------    GCD ---------------------

//1.什么是GCD?

//Grand Central Dispatch (大中央调度),纯C语言,提供了非常多强大的函数

//2. GCD的优势

//2.1 GCD是苹果公司为多核的并行运算提出的解决方法

//2.2 GCD会自动利用更多地CPU内核(双核,四核)

//2.3 GCD会自动管理线程的生命周期(包括,创建线程,调度任务,销毁线程)

//2.4 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码

// ----------------任务和队列-------------------------

//GCD中又两个核心概念

// 1. 任务 :执行什么操作

// 2. 队列 :用来存放任务

//GCD的使用就两个步骤

// 1. 定制队列

// 2. 确定想做的事情

//将任务添加到队列中,GCD会自动将队列中的任务取出,放到对应的线程中执行,任务的取出遵循队列的FIFO原则:先进先出,后进后出

//    ------------ 
执行任务----------------

//1.GCD中有两个用来执行任务的函数

//说明:
把右边的参数(任务)提交给左边的参数(队列)中执行

//(1) 用同步的方式执行任务  dispatch_sync(dispatch_queue_t queue, <#^(void)block#>)

//(2) 用异步的方式执行任务dispatch_async(dispatch_queue_t queue, <#^(void)block#>)

//2. 同步和异步的区别

//同步:
在当前线程中执行

//异步:
在另一条线程中执行

//    ------------- 
队列 -----------------------

// 1. 队列的类型

//1.1 并发队列
(Concurrent Dispatch Queue)可以让多个任务并发执行(自动开启多个线程同时执行任务),并发功能只由在异步函数(dispatch_async)下才有效

//1.2 串行队列
(Serial Dispatch Queue) 
让任务一个接着一个执行

// 同步,异步,并发,串行

// 同步和异步决定了要不要开启新线程

// 同步:
在当前线程中执行任务,不具备开启新线程的能力

// 异步:
在新德线程中执行任务,具备开启新线程的能力

// 并发和串行决定了任务的执行方式

// 并发:
多个任务并发执行

// 串行:
一个任务执行完毕后,再执行下一个任务

//--------------------  
串行队列 -------------------

//GCD中获取串行队列有两种方法

//1. dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>) //队列名称,
队列属性,一般为NULL

//2. dispatch_queue_t queue = dispatch_get_main_queue(),取到主队列,
主队列是GCD自带的一种特殊队列,
放在主队列中得任务,都会放到主线程中执行。

//    ----------------- 
并发队列   -------------------

// GCD默认已经提供了全局的并发队列,
供整个应用使用,不需要手动创建

//    dispatch_queue_t queue = dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>)
第一个参数为优先级, 第二个参数为保留参数,给以后使用的,传0即可。

//    ------------  
总结  --------------------

// 同步函数不具备开启线程的能力,
无论什么队列都不会开启线程。

// 异步函数具备开启线程的能力,
开启几条线程由队列决定(串行队列只会开启一条新德线程,并发队列会开启多条线程)

//    -----------  
补充  --------------------

//凡是函数中,各种函数名中带有create\copy\new\retain等字眼,都需要在不需要使用这个数据的时候进行release。

//GCD的数据类型在ARC的环境下不需要再做release。

//CF(core Foundation)的数据类型在ARC环境下还是需要做release。

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

//[self test1];

//    [self test2];

//    [self test3];

[self
test4];

}

//  在同步函数中的串行队列中添加任务,
不会开辟新线程

-(void)test1

{

//1. 创建串行队列 _t _ref C语言的数据类型

// 参数1 :
队列的名称

// 参数2 :
队列的属性 一般填NULL,表示创建串行队列,

// 参数2
中填 DISPATCH_QUEUE_SERIAL 创建串行队列

//    DISPATCH_QUEUE_CONCURRENT
创建并行队列

dispatch_queue_t queue =
dispatch_queue_create("Serial Queue",
NULL);

dispatch_sync(queue, ^{

NSLog(@"下载任务1,curThread = %@",[NSThread
currentThread]);

[NSThread
sleepForTimeInterval:2];

});//在这,要等到任务执行完成才会接到执行

NSLog(@"111");

dispatch_sync(queue, ^{

NSLog(@"下载任务2,curThread = %@",[NSThread
currentThread]);

});

NSLog(@"222");

dispatch_sync(queue, ^{

NSLog(@"下载图片任务3,currThread = %@",[NSThread
currentThread]);

});

NSLog(@"333");

}

//在同步函数中的并行队列中添加任务,
不会开辟新线程,并发的功能无效

-(void)test2

{

//1. 取到并行队列,在iOS中,系统为每一个应用程序已经准备了一天全局队列,该全局队列为并行队列。

// 参数1 :
队列的优先级, 一般取默认优先级

// 参数2 :
保留参数,填0

dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);

dispatch_sync(queue, ^{

NSLog(@"下载图片任务1, curThread = %@",[NSThread
currentThread]);

[NSThread
sleepForTimeInterval:2];

});

NSLog(@"111");

dispatch_sync(queue, ^{

NSLog(@"下载图片任务2,curThread = %@",[NSThread
currentThread]);

});

NSLog(@"222");

dispatch_sync(queue, ^{

NSLog(@"下载图片任务3,curThread = %@",[NSThread
currentThread]);

});

NSLog(@"333");

}

/**

*  在异步函数中的串行队列中添加任务,
会开辟新线程,但是只会开辟一个线程。

*/

- (void)test3

{

// 1. 创建串行队列

dispatch_queue_t queue =
dispatch_queue_create("Serial Queue",
DISPATCH_QUEUE_SERIAL);

//2. 通过异步函数在串行队列中添加任务

dispatch_async(queue, ^{

NSLog(@"下载图片任务1 , curThread = %@",

[NSThread
currentThread]);

[NSThread
sleepForTimeInterval:2];

});

NSLog(@"1111");

dispatch_async(queue, ^{

NSLog(@"下载图片任务2 , curThread = %@",

[NSThread
currentThread]);

});

NSLog(@"2222");

dispatch_async(queue, ^{

NSLog(@"下载图片任务3 , curThread = %@",

[NSThread
currentThread]);

[NSThread
sleepForTimeInterval:2];

});

NSLog(@"333");

}

/**

*  在异步函数中的并行队列中添加任务,
可能会开辟多个新线程

*/

- (void)test4

{

//1 .创建并行队列

dispatch_queue_t queue =
dispatch_queue_create("Concurrent Queue",
DISPATCH_QUEUE_CONCURRENT);

//2. 通过异步函数在并行队列中添加任务

dispatch_async(queue, ^{

[NSThread
sleepForTimeInterval:2];

NSLog(@"下载图片任务1 , curThread = %@",

[NSThread
currentThread]);

});

NSLog(@"1111");

dispatch_async(queue, ^{

NSLog(@"下载图片任务2 , curThread = %@",

[NSThread
currentThread]);

});

NSLog(@"2222");

dispatch_async(queue, ^{

NSLog(@"下载图片任务3 , curThread = %@",

[NSThread
currentThread]);

//        [NSThread sleepForTimeInterval:2];

});

NSLog(@"333");

}

@end

时间: 2024-11-02 08:53:00

iosGCD的简单介绍2的相关文章

python的列表,元组和字典简单介绍

引 入 java                                   python 存取多个值:数组或list集合 ------------------------> 列表,元组 key-value格式:    Map        ------------------------>    字典 自己学习发现,java跟python这两门面向对象语言在数据类型的定义上,很多思想都是互通的,这里不说java,简单介绍一下python的列表,元组和字典. 一.列表 List: 最通

javascript的return语句简单介绍

javascript的return语句简单介绍:return语句在js中非常的重要,不仅仅具有返回函数值的功能,还具有一些特殊的用法,有个清晰的把握是非常有必要的.下面就结合实例简单介绍一下return语句的作用.一.用来返回控制和函数结果:通常情况,return语句对于一个函数是很有必要的,因为往往需要函数在一系列的代码执行后会得到一个期望的返回值,而此值就是通过return语句返回,并且将控制权返回给主调函数.语法格式: return 表达式 代码实例如下: function add(){

Object-c集合的简单介绍

一.简单介绍 NSArray/NSMutableArray NSSet/NSMutableSet NSDictionary/NSMutableDictionary NSArray.NSSet.NSDictionary是不可变的,创建的时候初始化 NSMutableArray.NSMutableSet.NSMutableDictionary是可变的 二.使用介绍 NSArray是有序的数组 NSMutableArray *myArray=[[NSMutableArray alloc] init];

plsql的环境与介绍:环境的搭建和plsql的简单介绍

PLSQL编程 1.环境的搭建 (1)创建一个存储表空间 SQL> conn /as sysdbaConnected. SQL> create tablespace plsql datafile '/u01/oracle/oradata/ORCL/plsql01.dbf' size 1G; Tablespace created. (2)创建PLSQL用户SQL> create user plsql identified by plsql default tablespace plsql;

CSS之box-sizing的用处简单介绍

前几天才发现有 box-sizing 这么个样式属性,研究了一番感觉很有意思, 通过指定容器的盒子模型类型,达到不同的展示效果 例如:当一个容器宽度定义为 width:100%;  之后,如果再增加 padding 或者 border 则会溢出父容器,是向外扩张的 如果使用该样式,指定为 box-sizing: border-box; 则 padding 和 border 就不会再溢出,而是向内收缩的,这个效果感觉非常实用, 特别是 input 和 textarea 等 现在设置 100% 再直

【玩转微信公众平台之七】 PHP语法简单介绍

经过多篇的努力,我们终于成为了微信公众平台的开发者.但是别高兴的太早,就跟修真小说一样:修炼多年武破虚空,飞升到仙界后本以为成为了天仙即可跳出三界外,不在五行中.可实际到了仙界才发现,成仙只是修行的第一步......没错,成为开发者也才只是第一步,因为现在你的微信公众平台还没有任何功能,说难听点就是小白,说好听点就是白马王子,说可爱点就是小白白,说黄色点就是洗白白,说...----------------要想在微信公众平台添加功能,那就需要写代码:既然说到写代码,那么肯定是要用php(如果用AS

Zookeeper简单介绍

转自:ZooKeeper学习第一期---Zookeeper简单介绍 一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术--分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成"脏数据"的后果.这时,有人可能会说这个简单,写一个调 度算法就轻松解决了.说这句话的人,可能对分布式系统不是很了解,所以才会出现这种误解.如果这些进程全部是跑在一台机上的

七、变量与常量的简单介绍

七.变量与常量的简单介绍 本文将介绍VB语言中的变量与常量. 基本概念 首先大家要明白变量和常量是很重要的东西,因为他们储存着程序运行中的各种数据.顾名思义,变量就是可以变的量,而常量就是不变的,这个概念和数学上的有点接近. 接下来我简单讲讲这两个重要的东西:计算机程序在不运行的时候,程序文件保存在硬盘上,当用户运行程序之后,系统就会把程序文件装进计算机的内存里面,无论在硬盘中还是内存中,程序数据都是以二进制的形式保存着的.当程序在运行的时候,可以把计算机的内存理解为一个超级大的棋盘,每个格子都

TensorFlow简单介绍和在centos上的安装

##tensorflow简单介绍: TensorFlow? is an open source software library for numerical computation using data flow graphs.https://www.tensorflow.org/TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从图