首页 iOS.& Swift Books 通过教程并发

2
GCD.与运营 由Scott Grosch撰写

有两个API,您将在制作应用程序时使用: 大中央调度,通常被称为 GCD., 和 运营。这些都不是竞争技术,也不是你必须完全挑选的东西。事实上,运营建立在GCD之上!

大中央调度

GCD.是Apple的C's的实施 libdispatch. 图书馆。它的目的是排队 任务 - 取决于资源的可用性,可以并行运行的方法或闭包;然后它在可用的处理器核心上执行任务。

笔记:Apple的文档有时是指的 堵塞 替代 关闭,因为这是目标-c中使用的名称。您可以在并发的背景下认为它们可互换。

虽然GCD在其实施中使用线程,但您作为开发人员,您不需要担心自己管理它们。 GCD的任务是轻量级的,即苹果公司在其2009年技术简介关于GCD的技术简报中,阐述了实施只有15条指令,而创建传统线程可能需要数百条指令。

GCD.管理您的所有任务都被置于GCD管理中 首先,先进 (FIFO)队列。然后对系统提交给队列的每个任务都针对系统完全由系统管理的线程池执行。

笔记:您无法保证您的任务将针对哪些线程。

同步和异步任务

放入队列中的工作可以运行 同步 或者 异步。同步运行任务时,您的应用程序将等待并阻止当前运行循环,直到在继续下一个任务之前执行完成。或者,一个异步运行的任务将开始,但立即将执行返回到您的应用程序。这样,应用程序可以在第一个正在执行时自由运行其他任务。

笔记:请记住,虽然队列是基于FIFO的,但不确保任务将按您提交的顺序完成。 FIFO程序适用于任务时 开始而不是在它完成时。

一般来说,您要采取任何可以在后台找到的长期运行的非UI任务,并使其在后台异步运行。 GCD通过几行代码进行了封闭件非常简单,如下所示:

// Class level variable
let queue = DispatchQueue(label: "com.raywenderlich.worker")

// Somewhere in your function
queue.async {
  // Call slow non-UI methods here
  
  DispatchQueue.main.async {
    // Update the UI here
  }
}

You’ll learn all about DispatchQueue in Chapter 3, “Queues &线程。“通常,您创建队列,将任务提交到它在后台线程上异步运行,并且当它完成时,将代码委派回主线程以更新UI。

序列和并发队列

您的任务所提交的队列也具有其要素的特征 序列号 或者 同时。串行队列仅具有与它们相关联的单个线程,因此只允许在任何给定时间执行单个任务。另一方面,一条并发队列能够利用系统具有资源的许多线程。在并发队列中,将在必要时创建和释放线程。

笔记:虽然你可以告诉ios你想使用并发队列,但请记住没有 保证 多个任务一次将运行。如果您的iOS设备完全抛弃,并且您的应用竞争资源,它可能只能运行单个任务。

异步并不意味着并发

虽然差异起初似乎微妙,只是因为你的任务是 异步 并不意味着他们会运行 同时。您实际上能够将异步任务提交给串行队列或并发队列。同步或异步只是识别您运行任务的队列是否必须等待任务完成,然后才能产生下一个任务。

另一方面,将某种东西分类为 串行与并发 识别队列是否有一个 单身的 螺纹或者 线程可用。如果您考虑它,将三个异步任务提交给串行队列意味着在下一个任务之前,每个任务都必须完全完成,因为只有一个可用的线程。

换句话说,一项是同步的任务与否 资源 任务。串行或同时说话 目的地 of the task.

运营

GCD. is great for common tasks that need to be run a single time in the background. When you find yourself building functionality that should be reusable — such as image editing operations — you will likely want to encapsulate that functionality into a class. By subclassing Operation, you can accomplish that goal!

操作子类化

Operations are fully-functional classes that can be submitted to an OperationQueue, just like you’d submit a closure of work to a DispatchQueue for GCD. Because they’re classes and can contain variables, you gain the ability to know what state the operation is in at any given point.

以下任何州中可以存在操作:

  • isReady
  • isExecuting
  • isCancelled
  • isFinished

Unlike GCD, an operation is run synchronously by default, and getting it to run asynchronously requires more work. While you can directly execute an operation yourself, that’s almost never going to be a good idea due to its synchronous nature. You’ll want to get it off of the main thread by submitting it to an OperationQueue so that your UI performance isn’t impacted.

奖金特色

但等等,还有更多!操作可以更好地控制您的任务,因为您现在可以处理此类常见需求作为取消任务,报告任务状态,将异步任务包装到操作中并指定各种任务之间的依赖。第6章“操作”将提供更深入的讨论应用程序中的应用程序。

障碍物

Sometimes, you find yourself working on an app that heavily uses operations, but find that you have a need for a simpler, GCD-like, closure. If you don’t want to also create a DispatchQueue, then you can instead utilize the 障碍物 class.

障碍物 subclasses Operation for you and manages the concurrent execution of one or more closures on the default global queue. However, being an actual Operation subclass lets you take advantage of all the other features of an operation.

笔记:块操作同时运行。如果您需要串行运行,则需要安装调度队列。

你应该使用哪个?

无论您应该在应用程序中使用GCD或操作都没有清晰切割的指令。 GCD往往更简单地与您只需要执行和忘记的简单任务。当您需要跟踪作业或维护取消功能时,操作提供了更多的功能。

如果您只需使用需要执行的方法或块的代码,GCD是一个拟合选择。如果您正在使用需要封装数据和功能的对象,那么您更有可能利用操作。一些开发人员甚至会出于说出您应该始终使用操作,因为它建立在GCD之上,Apple的指导说,始终使用所提供的最高抽象级别。

在一天结束时,您应该使用哪种技术在最有意义的情况下,并提供项目的最大长期可持续性,或特定用途情况。

在下一章中,您将深入潜入Grand Central Spratch如何运作,了解线程和队列之间的区别,并识别在应用程序中实现并发时可能发生的一些复杂性。

然后去哪儿?

到下一章,当然!本书的其余部分将详细检查大中央派遣和运营。当您完成本书时,您将掌握两个选项提供的掌握,以及如何选择一个更好的想法。

有一个技术问题?想报告一个错误吗? 您可以向官方书籍论坛中的书籍作者提出问题和报告错误 这里.

有反馈分享在线阅读体验吗? 如果您有关于UI,UX,突出显示或我们在线阅读器的其他功能的反馈,您可以将其发送到设计团队,其中表格如下所示:

© 2021 Razeware LLC