Swift并行编程—第3/4部分

本文是Swift系列并行编程的第3部分。 在第1部分中,我们研究了Dispatch Queue和系统提供的队列。 在第2部分中,我们重点介绍了定义任务和GCD提供的强大API的另一种方法。 在这篇文章中,让我们看一下Operation API和与Grand Central Dispatch相比提供的灵活性。

如果要查看系列的所有部分:

并发和GCD — Swift并行编程— 1/4

GCD —使用Swift进行并行编程—第2/4部分

操作和操作队列概述—使用Swift并行编程—第3/4部分

操作是一种面向对象的方式,用于封装需要异步执行的工作。

Operation代表单个工作单元。 它是一个抽象类,提供了一个有用的,线程安全的结构,用于对状态,优先级,依赖关系和管理进行建模。

— NSHipster

由于操作是抽象类,因此您不能直接使用它。 Foundation提供了两个系统定义的子类InvocationOperationBlockOperation来执行任务。 就像在定义的子类中所说的那样,您只需要关注任务的实际实现即可。

一个操作只执行一次任务,因此不能再次执行它。 您可以通过将操作添加到操作队列中来执行操作。 操作队列可以通过在辅助线程上运行它们来直接执行其操作,也可以使用libdispatch库(即Grand Central Dispatch)间接地执行其操作。 因此, Operation API是Grand Central Dispatch的更高级别的抽象。

您可能想知道:什么任务? 🤔

让我们讨论以下术语:

  • 任务 :需要完成的一项工作。
  • 进程 :可执行代码块,可以由多个线程组成。 流程是您的应用程序的实例。 每当您执行应用程序的冷启动时,Process ID都会获得更改,而在您执行热启动时,它保持不变。 它包含执行应用程序所需的所有内容,其中包括堆栈,堆和所有其他资源。
  • 线程 :操作系统提供的一种机制,它允许多个指令集在单个应用程序中同时运行。 与进程相比,线程与其父进程共享其内存。 这可能会导致出现问题,例如让两个线程同时更改资源(例如,变量)。 线程是iOS上的有限资源。 一个进程最多只能同时有64个线程,而在任何文档中都没有正式提及,因为它会根据上下文和内核数量而有所不同。

操作状态:

操作对象在内部维护状态,以确定何时可以安全执行,并在操作的整个生命周期内将进度通知给外部客户。

isReady:在准备好执行操作时通知客户端。 当操作准备好立即执行时,此键路径返回true ;如果仍然依赖于该键路径,则返回false

isExecuting:此键路径告诉我们操作是否正在积极执行其分配的任务。 如果操作正在执行其任务,则isExecuting返回true否则,则返回false

isFinished:通知操作已成功完成其任务或被取消。 在isFinished键路径上的值更改为true之前,操作对象不会清除依赖关系。 同样,在isFinished属性包含值true之前,操作队列不会使操作出队。

isCancelled: isCancelled密钥路径通知客户端请求取消操作。

如果在调用start()方法之前取消操作,则start()方法将退出而不启动任务。

操作队列根据其优先级和就绪程度(按FIFO顺序)执行其排队的Operation对象。 将操作添加到操作队列后,该操作将保留在其队列中,直到完成其任务为止。 添加操作后,无法直接从队列中将其删除。

操作队列将保留操作直到操作完成,而队列本身将保留直到所有操作完成。 用未完成的操作暂停操作队列可能会导致内存泄漏。

队列中的操作根据其准备情况进行组织,即( isReady属性返回true ),优先级和相关性,并相应地执行。 如果所有排队的操作都具有相同的queuePriority并准备好在放入队列时执行,则将按照它们提交到队列的顺序执行它们。 否则,操作队列始终执行相对于其他就绪操作而言优先级最高的操作。

直到操作对象的所有相关操作都已完成执行,才认为该操作对象准备就绪。


感谢您阅读文章。

您可以在以下位置找到我:

Linkedin: Aaina Jain

推特: __aainajain