我们将使用原生的Grand Central Dispatch( GCD )框架研究iOS上Swift的并发编程。 如果您不熟悉并发编程,建议您先看一下Wikipedia。 让我们开始研究此API背后的哲学和良好实践。 GCD (Grand Central Dispatch)是一个框架,提供低级API来处理iOS,macOS,tvOS和watchOS平台上的并发编程。 苹果公司提供竞争管理的所有更高级别的框架(例如NSOperation )都基于GCD 。 这些API允许您将流程的工作划分为各个任务,然后使用队列帮助协调并行或顺序执行这些任务。 它使我们能够从线程,处理器或核心的概念中抽象出来,并同时利用其自己的线程池来优化资源管理。 GCD所基于的基本概念是FIFO(先进先出)。 我们要执行的任务将首先插入到这些队列中,然后GCD将单独检索它们,以将它们分派到正确的线程/处理器/心脏。 我们可以区分两种文件: 并发文件:并行执行多个任务 顺序或串行 文件:连续执行一对一的任务 这是现有文件的3类: Main queue :等同于主要处理应用程序UI的主线程。 所有UI调用都必须在此队列上完成。 Global queue :系统为我们提供3个具有不同优先级(高,默认和低)的全局尾部。 这3个文件是Concurrent类型的。 Custom queue :可以手动创建并具有所需类型(串行或并发)的队列。 让我们从创建3个队列类别之一开始: 为了创建自定义队列 ,我们首先定义一个标识符(建议使用反向DNS格式)。 现在我们知道了如何创建文件,如何使用它们? 非常简单,这要感谢“调度员”! 这是一个小例子: 让我们分解所有这些。 我们开始创建低优先级队列。 然后,我们在先前恢复的低优先级队列上异步“分发”代码块。 该代码块异步获取数据以将其存储在data变量中。 最后,我们使用恢复的数据更新主线程中的view 。 在主线程中执行最后一步非常重要,因为UIKit不是线程安全的,并且如果您在另一个线程中更新组件,则应用程序可能崩溃或具有未定义的行为。 控制台将在此处显示: 之前 后 内部异步块 在主队列块内 完蛋了! 使用GCD您可以管理所有有关并发编程的问题。 在本节中,我们将进一步介绍不同的使用情况。 […]
在上图中,您可以看到: 附录🌎已分配给线程2。 修改 ⚽已分配给线程5。 由于我是有意添加usleep(3)的,因此您可以看到Modify⚽得到了一个Error: Index out of range 。 两个线程访问相同的资源均导致此竞态条件 。 有几种方法可以解决此问题。 同步 同步的作用是确保完成指定的任务,这意味着告诉队列中的下一个任务等待。 屏障 当屏障执行时,它就像一个串行队列。 仅执行指定的任务。 屏障完成后,队列返回到正常的并发队列。
您是否曾经见过您的应用程序冻结或感觉不舒服? 这样的事情。 我必须告诉你,这不是一个断点,应用程序已完全冻结,我无法按下另一个按钮,我将向您解释原因。 该按钮仅运行以下代码 同样重要的是要注意每个队列都有不同的优先级,如下所示 交互式用户的优先级高于用户实例化的优先级,因此,您需要注意派遣队列需要哪种类型的服务质量。 如您所见,蓝点占主导地位,这是因为🔵蓝点的打印优先级高于🔴红点的队列,计数也很明显,蓝点打印了115点,而红点只打印了115点。 41。 为了避免冻结,我们可以将所有工作负荷放在一个队列中,还可以添加取消流程的功能,因为用户可能希望取消流程并返回到您的应用程序。 代码在哪里? 如果您想自己运行,可以下载此示例的我的仓库! 编码愉快! 🚧 chuynadamas / GCD-BasicExample GCD-BasicExample –使用工作项和调度队列的基本示例 github.com
多任务处理使我们可以同时运行许多任务。 GCD(Grand Central Dispatch)是在iOS中实现多任务处理的最简单方法。 我们将任务添加到调度队列,这些任务又在多个线程上同时执行。 我们可以在后台线程上执行诸如下载或搜索之类的耗时任务,这将使UI响应用户。 iOS提供了用于在后台线程上执行任务的全局调度队列,以及用于在main / UI线程上执行任务的主调度队列。 我们还可以创建自己的任务执行队列。 let queue = DispatchQueue(标签:“ com.gcd.simpleQueue”) 我们需要为队列提供唯一的标签。 它可以是任何字符串,但是约定是使用反向域名(反向DNS)。 要执行任务,我们必须将其称为.async或.sync 方法。 任务不过是要执行的代码块。 queue.async { _ in 1…5 { 打印(“ clap..clap..👏”) } } 输出: 拍手..拍手..👏 拍手..拍手..👏 拍手..拍手..👏 拍手..拍手..👏 拍手..拍手..👏 调度队列上的.async和.sync方法告诉系统如何执行任务。 让我们用下面给出的示例进行检查。 func executeSync(){ 让队列= DispatchQueue(label:“ com.gcd.simpleQueue”) print(“ Start Race:”) //在同步模式下在队列上运行 queue.sync { 因为我在0 .. <5 { print(“ 🐢 […]