Swift的甜蜜点滴:Dispatch框架(iOS 10 +)

iOS SDK具有NSOperation和NSOprerationQueue类,它们是用于异步处理的强大类。 苹果公司推出了Grand Central Dispatch,这是另一种执行多任务处理的高级方法。 本文介绍了快速的Dispatch框架。

原始的GCD库像C库一样使用。 例如,通过调用函数并使用诸如dispatch_queue_create,dispatch_semaphore_create等结构。不幸的是,这可能会排斥某些开发人员或迫使他们编写包装器。 就我而言,我必须开发自己的包装器。 希望iOS10附带的新Dispatch框架将所有GCD功能封装在类中。 现在,它更易于使用,代码也更加简洁。 没有任何不使用它的借口:)。

让我们从Dispatch框架的概述开始

总览

Dispatch框架由用于编写并发代码的类组成。 它支持iOS,macOS,tvOS和watchOS。

在GCD中要理解的主要概念是“ 调度队列 ”。 它是通过块或DispatchWorkItems提交的任务的容器。 调度队列中的任务称为工作项 。 分派队列中的工作项按FIFO顺序拉出。

分派队列可以是串行的,也可以是并发的。 串行队列按顺序依次执行其工作项。 并发队列按FIFO顺序对工作项进行排队,并一次同时运行它们。 在并发调度队列中,我们无法预测工作项的完成顺序。

调度框架允许操纵系统提供的队列:

  • 主队列允许将工作项提交到主线程(或UI线程)
  • 具有不同服务质量的全局并发队列。

DispatchQueue类封装了分派队列概念。 DispatchWorkItem类封装了调度工作项概念。

让我们练习一些DispatchQueue函数。

调度队列

在此示例中,我们在全局队列上同时执行两个循环。

.global()函数返回默认的全局队列。 异步功能意味着执行流程不会等待块完成。 如果要等待块完成,请使用sync()方法。 同步和异步方法都采用不同的参数,最常见的一种是传递一个块。

在这里,我们在不同的QoS队列上执行这些块:

服务质量(QoS)限定了优先级,并有助于系统优化其性能。 从高优先级到低优先级有5种QoS类别排序:

  • 用户互动:这是与主要主题相对应的类。
  • 用户启动的:用户触发的操作不必在主线程上运行。 它等效于DISPATCH_QUEUE_PRIORITY_HIGH。
  • 默认 :默认QoS。 它等效于DISPATCH_QUEUE_PRIORITY_DEFAULT。
  • 实用程序 :用于依赖于系统资源(例如文件和网络I / O)的调度项目。 它等效于DISPATCH_QUEUE_PRIORITY_LOW。
  • 背景 :用于优先级较低的任务。 它等效于DISPATCH_QUEUE_PRIORITY_BACKGROUND。

除了使用具有userInteractive QoS的全局队列之外,我们还可以使用主调度队列将工作提交到主线程,如以下代码示例所示:

注意不要在主队列上同步执行工作。 否则,将导致死锁。

我们可以很容易地创建一个新的调度队列:

调试时,标签“我的调度队列”将出现在线程列表上的相应线程上。

DispatchQueue允许使用并发性能简单地执行并发循环。

到目前为止,我们仅将块传递到调度队列。 在下一节中,我们将介绍定义任务的另一种方法。

DispatchWorkItem

DispatchWorkItem类是对工作项概念的封装。 为了使用它,我们使用一个块将其初始化为一个实例,然后我们可以在当前线程上运行它或将其提交到调度队列。

调度工作项具有取消标志。 如果在运行之前将其取消,则调度队列将不会执行它,而是将其跳过。 如果在执行过程中取消了它,则cancel属性返回True。 在这种情况下,我们可以中止执行

我发现处理DispatchWorkItem的取消非常丑陋。

我们还可以指定一个工作项目,该工作项目将在调度工作项目完成后使用notify函数完成。

通常,Dispatch函数可以将块或DispatchWorkItem用作参数。 使用最适合您的一种。

下一节介绍调度组。

派遣组

调度组允许跟踪不同工作项的完成,即使它们在不同队列中运行也是如此。

下一节将介绍调度信号量。

DispatchSemaphore

DispatchSemapohre类允许使用信号量控制执行流。

我们还可以为wait函数指定一个超时时间。

现在是时候总结了:)。

结论

本文是Dispatch框架的简介。 我们尝试了以下类:DispatchQueue,DispatchWorkItem,DispatchGroup和DispatchSemaphore。 这里没有尝试其他许多功能和可能性。 因此,我只建议您拿起键盘,打开Apple文档(下面的链接),然后玩得开心:)。

可以在GitHub上找到本文的游乐场:https://github.com/yostane/Swift-sweet-bits/tree/master/dispatch_queue.playground

请注意,我引入了睡眠来控制样品的流动。

参考文献:

调度
调度包括语言功能,运行时库和系统增强功能,这些功能可提供系统,全面的信息 。developer.apple.com 带调度队列的QoS
移动系统需要权衡各种因素才能获得最佳性能。 最好的是什么…… www.allaboutswift.com