iOS中的GCD多线程

GCD为Grand Central Dispatch的缩写

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并行任务。

GCD提供给我们一个简易使用的并发模型,通过推迟昂贵的计算任务来提高应用的响应性能

GCD 提供有 dispatch queues 来处理代码块,这些队列管理你提供给 GCD 的任务并用 FIFO 顺序执行这些任务。这就保证了第一个被添加到队列里的任务会是队列中第一个开始的任务,而第二个被添加的任务将第二个开始,如此直到队列的终点。 GCD
提供给你至少五个特定的队列,可根据队列类型选择使用。

主线程是唯一可以更改UI的线程,当你需要对UI进行操作的时候,为了减少卡顿最好把它们放在main queue里面

全局调度队列有四个,分别有着不同的优先级: background
low default high, 而且你也可以创建自己的队列

       

func
dispatch_async(_
queue:

dispatch_queue_t,

           
_
block:
dispatch_block_t)

该函数是GCD的使用中最常用的函数,传入两个参数,第二个参数为一个闭包,里面包含了需要被执行的操作,第一个参数是个队列,表明该闭包应该在哪个队列上执行,该函数立即返回,不会等待整个闭包操作的执行完成

       

func
dispatch_after(_
when:

dispatch_time_t,


_
queue:
dispatch_queue_t,

           
_
block:
dispatch_block_t)

该函数相当于一个延迟版的dispatch_async,第一个参数表明多少纳秒后开始执行该函数

通过if条件语句来确保单例只被实例化一次并不是靠谱的选择,这时采用下面的函数能够保证单例真的是单例

       

func
dispatch_once(_
predicate:

UnsafeMutablePointer<dispatch_once_t>,

           
_
block:
dispatch_block_t)

是否会被初始化多次并不是单例面临的唯一问题,当一个实例在被读取的过程中同时被写是线程不安全的,在自定义并发队列中,你可以选择采用以下函数来解决

       

func
dispatch_barrier_async(_
queue:

dispatch_queue_t,

           
_
block:
dispatch_block_t)

Dispatch barriers 是一组函数,在并发队列上工作时扮演一个串行式的瓶颈。使用 GCD 的障碍(barrier)API 确保提交的 Block 在那个特定时间上是指定队列上唯一被执行的条目。这就意味着所有的先于调度障碍提交到队列的条目必能在这个 Block 执行前完成。

当这个 Block 的时机到达,调度障碍执行这个 Block 并确保在那个时间里队列不会执行任何其它 Block 。一旦完成,队列就返回到它默认的实现状态。 GCD 提供了同步和异步两种障碍函数。

当你需要保证写在异步闭包里的一个操作必须要等前一个操作完成时才能开始的时候,你会需要使用到同步函数

       

func
dispatch_barrier_sync(_
queue:

dispatch_queue_t,

           
_
block:
dispatch_block_t)

dispatch_sync() 同步地提交工作并在返回前等待它完成,将该函数放在主队列和自定义串行队列很有可能会导致死锁,最好的选择是将其放在并发队列中

解决对多个异步任务的完成进行监控的问题,是设计 dispatch_group 的目的

Dispatch Group 会在整个组的任务都完成时通知你。这些任务可以是同步的,也可以是异步的,即便在不同的队列也行。而且在整个组的任务都完成时,Dispatch Group 可以用同步的或者异步的方式通知你。因为要监控的任务在不同队列,那就用一个
dispatch_group_t 的实例来记下这些不同的任务

有些方法的末尾写着一些CompletionBlock,但当方法内部存在异步操作的时候,CompletionBlock就可能在所有操作未完全完成前被调用

为了解决这个问题,我们可以用到dispatch_group_wait

因为使用的dispatch_group_wait是同步的
,它会阻塞当前线程,所以你要用 dispatch_async 将整个方法放入后台队列以避免阻塞主线程

在内部用dispatch_group_create()来创建一个新的dispatch_group_t实例

dispatch_group_enter(dispatch_group_t实例)来进入一个group

dispatch_group_leave(同一个dispatch_group_t实例)来离开一个group

dispatch_group_wait(同一个dispatch_group_t实例,等待时间)来同步的等待该group内的所有操作执行完成

当工作执行完成后可采用dispatch_asyn函数异步切回主线程执行后续操作

若采用dispatch_group_notify来替换dispatch_group_wait的话,就不需要在开头调用dispatch_async将方法放入其它队列,因为该方法是异步的,最后也不需要单独的dispatch_async,原闭包内的操作可以直接写在dispatch_group_notify的闭包中,但当然也要将操作放在主队列中

       
func dispatch_apply(_
iterations:
Int,

_ queue:
dispatch_queue_t!,

           
_ block: (Int)
->
Void)

在自定义并发队列里采用上方函数可以并发的执行迭代操作以提高性能,但对于小集合来说,并发执行所带来的性能优化可能并不如多创建并运行一个线程的开销大

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 12:31:18

iOS中的GCD多线程的相关文章

iOS开发中的gcd多线程tips

iOS开发中的gcd多线程tips 我们经常用到的: dispatch_async(dispatch_get_global_queue(0, 0), ^{ // 处理耗时操作的代码块 //通知主线程刷新 dispatch_async(dispatch_get_main_queue(), ^{ //回调或者说是通知主线程刷新 }); }); 其中main_queue是系统默认的串行队列,global_queue是系统默认的并行队列. 什么是串行队列(Serial)? 创建任意个数的串行队列,每个队

iOS开发之GCD 多线程 1.串行队列 2.并行队列 3.分组 4.信号量 详细讲解

GCD多线程下,实现线程同步的方式有如下几种: 1.串行队列 2.并行队列 3.分组 4.信号量 实例: 去网上获取一张图片并展示在视图上. 实现这个需求,可以拆分成两个任务,一个是去网上获取图片,一个是展示在视图上. 这两个任务是有关联的,所以需要同步处理. 下面看这几种方式如何实现. 一. 1.串行队列 1.1[GCD相关:] (1)GCD下的dispatch_queue队列都是FIFO队列,都会按照提交到队列的顺序执行. 只是根据队列的性质,分为<1>串行队列:用户队列.主线程队列 &l

iOS中通过GCD实现多线程用法

GCD简介 GCD全称Grand Central Dispatch,可翻译为“牛逼的中枢调度器”. 纯C语言,提供了非常多强大的函数. GCD优势: GCD是苹果公司为多核的并行运算提出的解决方案. GCD会自动利用更多的CPU内核(比如双核.四核). GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程). 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码. 任务和队列 GCD中有2个核心概念 任务:执行什么操作. 队列:用来存放任务. GCD的使用就2个步骤 定制任

ios开发:GCD多线程

ios有三种多线程编程技术,分别是NSThread,Cocoa NSOperation和GCD,GCD全称Grand Central Dispatch 是Apple开发的一个多核编程的解决方法,在iOS4.0开始之后才能使用.GCD是一个可以替代NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术,而且其使用起来比前两者更加的简单方便,今天主要给大家介绍一下有关GCD的使用. GCD的工作原理是:让程序平行排队的特定任务,根

线程同步和异步的区别?IOS中如何实现多线程的同步?

1.线程同步是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 ,串行执行任务 线程异步:访问资源时在空闲等待时同时访问其他资源,实现多线程机制,并行执行任务 1.2.3模式 使用GCD的主队列.使用NSOperationQueue,把最大线程数(并发)设为1    1.1.1 2.OC中是所有对象间的交互是如何实现的? 通过消息发送机制实现    对象---方法 3.描述上拉加载.下拉刷新的实现机制? 继承自滚动视图,滚动视图的两个属性offset (x,y)表示偏移量,inset

ios 中的 GCD

摘自:http://www.cocoachina.com/swift/20150129/11057.html libdispatch是Apple所提供的在IOS和OS X上进行并发编程的库,而GCD正是它市场化的名字.GCD有如下优点: – GCD可以将计算复杂的任务放到后台执行,从而提升app的响应性能 – GCD提供了比锁和线程更简单的并发模型,帮助开发者避免并发的bug. 为了理解GCD,你需要了解一些线程和并发的概念.这些概念可能很含糊并且细微,所以先简要回顾一下. 串行 vs 并发 这

iOS开发关于GCD多线程方面的知识(1)

1.同步和异步 (1)同步(sync):A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求 不到,怎么办,A线程只能等待下去 (2)异步(async):A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程 仍然请求的到,A线程无需等待

IOS中的多线程之GCD

在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下CDD的使用. GCD(Grand Central Dispatch) ,他是基于C语言开发的一套多线程开发机制,也是目前苹果官方推荐的多线程开发方法.GCD的抽象层次最高,用起来比较简单,但是因为它是基于C语言开发的,是面向过程的,所以在使用的时候不如面向对象的好理解.但是GCD这种机制相比较于前面两种多线程开发方式最显著的优点就是它对于多核运算更加

iOS中的多线程 NSOperation

在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下NSOperation的使用. NSOperation和NSOperationQueue这种方式实际上是将NSOperation的对象放到一个NSOperationQueue队列中,然后依次启动操作,类似于线程池的使用. 在使用的过程中,NSOperation的操作使用的是它的子类,分别是NSInvocationOperation和NSBlockOpe