中央中央调度(GCD)第一部分

众所周知,如果没有并发编程或多个CPU,愚蠢的计算机一次不能完成一项任务

点击此处获取示例应用

介绍 :

并发在编程语言中是一个巨大的话题,并且有点低级。 在本文中,我将讨论并行编程。 有很多用于并发的API.Apple发布了两个用于并发编程NSOperation和Dispatch Queue的低标签API。我将介绍Grand Canter Dispatch(GCD),并探讨我们为什么需要它以及如何使用Swift来实现它,并希望您能精通在这个API上..所以,让我们一起摇滚吧..

那么为什么我们需要并发:

我们都知道计算机(单核)不能一次执行多任务。但是在计算中,多任务是必不可少的。因此,为了解决这个问题,发明了并发概念。并发是一次执行多任务的方式。

在高度上:考虑我们有一个应用程序,它一次有两个任务,一个是从网络下载数据,另一个是更新UI。两个任务都需要同时执行。如果下载(网络请求)需要一些时间,例如30此时用户界面将停止更新。并且应用程序将冻结甚至被压碎。从用户角度来看,它的作用各不相同。没有用户会再次使用此应用程序。 我们需要并发编程。

所以

在深入探讨并发之前,我们需要回顾一些定义,这将有助于我们进一步了解:

任务可以串行或同时执行两种方式

串行:任务可以一个接一个地执行。一个任务在其上一个任务完成时开始启动,例如FIFO(先入先出)。

我们可以举一个例子,例如电影院售票柜台。 如果有一个柜台,所有顾客都排队。 它是一个串行队列。当一位顾客购买票时,他将不在排队,下一位顾客将来取票。 它是一个串行队列。

并发:

并发只是一个概念,它可以同时运行多个任务,这可以在单核CPU或多核CPU中发生。在单核CPU中,它是通过时间分片来实现的。一个线程先执行上下文切换,然后再运行另一个线程线程或多核CPU通过并行执行多个线程。

并发是两种类型:

1,并发无并行

2并行并行

线程:

线程是进程的子单元,换句话说,线程是由操作系统调度程序独立调度的任务组。

Queue列:

队列是按先进先出(FIFO)的顺序管理对象的数据结构。在我们的示例电影票客户线上是队列。

为什么我们需要并发?

由于一些非常重要的原因,我们需要并发:

始终响应UI :在任何iOS应用程序首次启动时,默认情况下都会运行一个主队列。主队列可以更新用户界面。因此,我们需要使此队列仅用于UI和后台队列中的其他繁重任务。因此,此处进行并行编程需要解决这个问题。

利用iOS设备:如今,iOS设备是多核处理器,通过并发编程,我们可以并行使用多核处理器。

释放到主队列

大坎特派遣(GCD):

因此,我们已经为并行编程涵盖了足够的主题.Apple有两个用于并行编程的API.NSOperation和GCD。最常用的是GCD(Grand Canter Dispatch)。我们可以通过此API在iOS和MacOS上管理多线程。同步和异步任务队列。

GCD有调度队列,用于按FIFO顺序一个接一个地管理所有队列。GCD提供两种类型的队列,分别是串行队列和并发队列。这两个队列可以同步运行,也可以异步运行。我们将在一段时间后讨论。

串行队列:

串行队列可确保在任何给定时间仅运行一项任务。 GCD控制执行时间。 我们不知道任务何时开始并最终由调度队列管理。

在此图中,所有正在运行的任务都是按一个接一个的顺序执行的任务1比tast 2完成tn thn任务3启动等等…

并发队列:

并发队列一次运行多个任务。 所有任务都是按顺序添加的,但我们不知道什么时候全部完成或一次要执行多少任务都由系统管理。

如图所示,任务1开始并且这次没有任务在运行,但是任务1和任务2在同一时间启动,但是任务1在任务2之前完成了,所以并发队列我们不知道任务什么时候完成或如何完成我们将花费很多时间,我们只是知道任务将按照我们的订购方式运行。

它的依赖于调度到多个任务的队列将在不同的内核上运行或通过上下文切换发生。但是通常,如果内核可用而不是在内核上发生,则通常使用上下文切换。

GCD提供了三种主要的队列类型:

  1. 主队列 :它在主线程上运行,并且a是串行队列。所有更新的UI都在此队列中发生。
  2. 全局队列 :它的并发队列和它的调用还有后台队列,它由整个系统共享,并且根据任务优先级,该队列有六个不同的队列。

3,自定义队列 :这个由用户(开发人员)创建的队列可以是串行的或并发的,最好不要创建自定义队列,而不要使用苹果默认的全局队列

现在开始创建队列:

创建调度队列的最简单方法是这样的:

  let queue = DispatchQueue(标签:“ com.simpleQueue.Ekram”) 

在这里,我创建了一个具有唯一标签的自定义队列。使用反向DNS表示法来命名是很好的做法,Apple建议不要使用它。

起始码:

因此,现在我们只需创建任务并将其添加到此队列即可。 所以在这里我创建了一个简单的项目并将其附加在github中。这个项目非常简单,我创建了一个函数,我将在该函数中编写代码,然后从viewDidAppear中调用它。 像这样 ..

在simpleQueue函数中,我创建了一个名为queue的调度队列,其标识符为“ com.simpleQueeue”,然后使用同步方法添加到队列中。我们也可以通过异步方式添加任务。稍后我们将进行讨论。 我们使用for循环打印简单字符串和Love emoj添加任务,如果我们在此代码块之前添加另一个lop的话。

自定义序列队列:

在控制台中,它打印10次“ Custom Green Lover”,然后打印“ General lover”,因为第一个循环已将同步方法添加到队列中,并且被阻塞,当其完成的任务比开始第二个循环时又打印了十次“一般的爱”。

  1. 这里的Queue是串行队列,因为我们没有将它的属性设置为并发。如果我​​们未将其属性设置为默认的串行队列,那么它就是串行队列。
  2. 同步方法块执行完比返回

3.如果我们不创建任何队列,默认队列是main queue。

使用异步方法的自定义串行队列:

现在,如果我们将方法同步更改为异步,那么看看会发生什么

因此,在控制台中,我们看到了一个有趣的输出。 由于我们将同步更改为异步。异步方法在任务完成之前返回.so主队列现在是空闲的,因此当异步返回主队列执行时。所以两个队列都并行执行。我的自定义队列在后台执行。

重要的是要知道自定义队列具有优先级的属性。哪个队列对将首先执行的系统更为重要,而不是对系统更重要。 现在有必要告诉我们,主队列始终是高度优先级队列,并且从此队列更新的所有UI元素及其使应用程序响应的方式。在其他GCD上,有一个名为Quality of Service的枚举,它具有所有其他六个优先级情况。通过这六个情况我们可以确定哪个任务将获得哪个优先级。我正在总结所有情况,也称为Qos类。这里列出的第一类是更高的优先级,最后一个是最低的优先级:

服务质量(Qos)主要有6个级别

(Apple的任务和持续时间说明)

UserInteractive(最高优先级):与用户交互的工作,例如在主线程上操作,刷新用户界面或执行动画。 如果工作不能很快进行,则用户界面可能会冻结。 专注于响应能力和性能

工作时间:工作几乎是瞬时的。

UserInitiated:用户已启动的工作,需要立即执行的结果,例如打开保存的文档或在用户单击用户界面中的某些内容时执行操作。 需要进行此项工作才能继续用户交互。 专注于响应能力和性能。

工作时间:工作几乎是瞬时的,例如几秒钟或更短。

默认值:此QoS的优先级介于用户启动和实用程序之间。 开发人员不打算使用此QoS对工作进行分类。 未分配QoS信息的工作被视为默认工作,并且GCD全局队列在此级别运行。

实用程序:这项工作可能需要一些时间才能完成,并且不需要立即取得结果,例如下载或导入数据。 实用程序任务通常具有用户可见的进度栏。 专注于在响应能力,性能和能效之间取得平衡。

工作时间:工作需要几秒钟到几分钟。

背景:在后台运行且对用户不可见的工作,例如索引,同步和备份。 专注于能源效率。

工作时间:工作需要花费大量时间,例如几分钟或几小时。

未指定(最低):表示没有QoS信息,提示系统应该推断环境QoS。 如果线程使用可能使线程退出QoS的旧版API,则它们可能具有未指定的QoS。

让我们用Qos编码:

首先,在我们的简单应用程序中,我们创建了名为queusWithQosAtrribute()的新函数,并从viewDidAppear()对其进行调用。

首先像这样创建两个队列

所以这是一个异步方法,这就是为什么它不阻止执行另一个队列,并且两个队列都具有相同的优先级。因此,两个队列都执行一个而不是启动另一个队列。

不,我们可以将一个queueTwo Qos属性更改为实用程序,然后看看我们在控制台中得到什么输出:

第一个调度队列的执行速度比第二个队列的执行速度快,因为cos实用程序Qos的优先级最低。因此,第二个队列可以在第一个队列运行时运行,但没有运行。因为第一个调度队列的优先级更高(用户启动),因此比第二个队列高。

因此,我们对优先级几乎一无所知,但我们将再进行实验。将第一个Qos更改为背景:

这次第二个队列的运行速度快于第一个队列的cos实用程序的优先级高于背景的优先级。

现在让我们尝试使用Main queue在第二个Queue的前面添加另一个lop。

因此,这是主队列的另一个示例是最高队列,因此它比其他两个并行队列运行得更快。

并发队列:

所以在这里,我们可以通过在创建Dispatch队列时初始化并发作为参数来创建自定义并发队列。

这是newQueue具有三种类型的任务,它们依次依次执行。没什么特别的。

现在让我们选择属性参数属性作为并发,如下所示:

因此,超过三个队列正在一起执行其并发魔力。所有并行执行..和Qos也会生效……

所以这里我们已经介绍了很多,我将在下 一篇文章中 解释 感谢您与我在一起Keep Keeping不要忘了分享和鼓掌

单击此处查看第2部分。