Operation 和 OperationQueue 入门

4 分钟读完

Concepts

在 iOS 和 macOS 中,thread 功能是由 POSIX Threads API(pthreads) 提供的,并且是操作系统的一部分。pthreads 比较底层,容易出错且不易发现。

Operation vs. GCD

GCD 结合了语言特性、运行时库、系统增强,提供了系统级的多线程实现,充分利用 iOS 和 macOS 设备的多核。

Operation 是构建于 GCD 之上的,更高级别的封装。

How to Choose

  1. GCD 是一个轻量级的实现多线程的方式。不用手动安排任务,系统会帮助我们安排。不易于处理任务间的依赖。对于取消和暂停任务的执行需要做一些额外的工作
  2. Operation 在 GCD 之上增加了更高级的特性,可以方便的添加任务的依赖,还可以重用、取消、暂停任务

How to Use

  1. Operation 是一个抽象类,每个继承的子类表示一个具体的任务

  2. 重写 main 方法来进行具体的任务

  3. main 方法任务开始前和结束后查看 isCancelled 检查任务是否被取消来决定是否需要进行后续的操作

  4. main 方法在网络任务结束后可以对数据进行进一步的处理

  5. 开始任务时,创建一个 Operation 子类的实例,添加到对应的队列中(异步执行)或者调用 Operationstart 方法(同步执行)

    在耗时操作开始前检查任务是否被取消是一个好的习惯

Suspend and Cancel Operation

可以设置 OperationQueueisSuspended 属性为 truefalse 来暂停/开始任务,不可以对单独的任务设置

调用 Operationcancel 方法取消任务的执行

Dependency

可以调用 OperationaddDependency(op:)removeDependency(op:) 方法来添加和移除依赖

一个被依赖的任务被取消的时候,依赖的任务依旧会执行,就像被依赖的任务正常完成一样

Reference

  1. 不完整翻译自 raywenderlich
  2. demo

留下评论