内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

iOS多线程之GCD(附实战实例)

2018-05-14 17:47 出处:清屏网 人气: 评论(0

GCD作为缩写意义有多种 。它通常表示最大公约数(greatest common divisor,简写为gcd;或highest common factor,简写为hcf),此外它还是共产党的拼音缩写和游戏《鬼吹灯外传》的拼音缩写和“创意群总监”的英文缩写。

全称:GCD为Grand Central Dispatch的缩写

GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。GCD的工作原理是让一个程序,根据可用的处理资源,安排他们在任何可用的处理器核心上平行排队执行特定的任务。

提示

(1)GCD存在于libdispatch.dylib这个库中,这个调度库包含了GCD的所有的东西,但任何IOS程序,默认就加载了这个库,在程序运行的过程中会动态的加载这个库,不需要我们手动导入。

点击+a按钮,可以导入框架。

(2)GCD是纯C语言的,因此我们在编写GCD相关代码的时候,面对的函数,而不是方法。

(3)GCD中的函数大多数都以dispatch开头。

GCD中有2个核心概念

(1)任务:执行什么操作

(2)队列:用来存放任务

GCD使用的两个步骤:

1.创建任务:确定要做的事情

2.将任务添加到队列中

GCD会自动将队列中的任务取出,放到对应的线程中执行

任务的取出遵循队列的 FIFO (First In First Out)原则:

先进先出,后进后出

GCD的优势:

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

GCD会自动利用更多的CPU内核(比如双核、四核)

GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)

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

队列的类型:

GCD的队列可以分为2大类型

队列

1.队列的类型

GCD的队列可以分为2大类型

(1)并发队列(Concurrent Dispatch Queue)

可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效

(2)串行队列(Serial Dispatch Queue)

让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)

简单用法

1.(1)串行队列,同步执行

不会新建线程,按顺序执行任务(毫无用处)

#define DISPATCH_QUEUE_SERIAL NULL//串行队列//dispatch_queue_t q = dispatch_queue_create("test", NULL);dispatch_queue_tq = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);for(inti =0; i <10; i++) {//同步执行dispatch_sync(q, ^{NSLog(@"%@ -- %d",[NSThreadcurrentThread],i);    });}

(2)串行队列,异步执行

会新建线程,按顺序执行任务(非常有用)

//只有一个线程,因为是串行队列,只有一个线程就可以按顺序执行队列中的所有任务dispatch_queue_tq = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);for(inti =0; i <10; i++)    {//异步执行dispatch_async(q, ^{NSLog(@"%@ -- %d",[NSThreadcurrentThread],i);        });    }

2.(1)并行队列,异步执行

会新建多个线程,但是无法确定任务的执行顺序(有用,但是很容易出错)

dispatch_queue_tq = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);for(inti =0; i <10; i++)    {//异步执行dispatch_async(q, ^{NSLog(@"%@ -- %d",[NSThreadcurrentThread],i);        });    }

(3)并行队列,同步执行

不会新建线程,按顺序执行任务(几乎没用)

dispatch_queue_tq = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);for(inti =0; i <10; i++)    {//异步执行dispatch_sync(q, ^{NSLog(@"%@ -- %d",[NSThreadcurrentThread],i);        });    }

一些系统提供的队列

1.全局队列

全局队列本质就是 并发队列

dispatch_get_global_queue(0,0);

全局队列和并发队列的区别

并发队列有名称,可以跟踪错误,全局队列没有

在ARC中不需要考虑释放内存, dispatch_release(q);不允许调用。在MRC中需要手动释放内存,并发队列是create创建出来的 在MRC中见到create就要release,全局队列不需要release(只有一个)

一般我们使用全局队列,但是建议同一类事情创建一个固定的队列进行管理,比如编写SDK我们不能使得我们的SDK导入的时候影响到别人队列里面的操作,导致别人莫名其妙导入你的SDK之后出现了卡顿,因此建议编写网络框架、处理绘图、编写其他轮子代码的时候创建一个自己专属的队列。

2.主队列

主队列,异步任务

不开线程,同步执行

主队列特点:如果主线程正在执行代码暂时不调度任务,等主线程执行结束后在执行任务

主队列又叫 全局串行队列

主队列,同步执行

程序执行不出来(死锁)

死锁的原因,当程序执行到下面这段代码的时候

主队列:如果主线程正在执行代码,就不调度任务

同步执行:如果第一个任务没有执行,就继续等待第一个任务执行完成,再执行下一个任务此时互相等待,程序无法往下执行(死锁)

//主队列的特点:主队列只有当主线程空闲下来的时候才能够执行主队列里面的任务dispatch_sync(dispatch_get_main_queue(), ^{NSLog(@"哈哈");    });

示列2个代码:1.用异步函数往并发队列中添加任务

2.会开启线程,但是只开启一个线程

用同步函数往并发队列中添加任务


分享给小伙伴们:
本文标签: GCD多线程iOS

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号