创建高级操作

Foundation 框架提供了 Operation 类型,它表示一个高级对象,它封装了可以在队列上执行的一部分工作。队列不仅协调这些操作的性能,而且还可以在操作之间建立依赖关系,创建可取消的操作,约束操作队列使用的并发度等。

Operations 在所有依赖项完成执行后即可执行。然后 isReady 属性变为 true

创建一个简单的非并发 Operation 子类:

Version >= 3.0

class MyOperation: Operation {

    init(<parameters>) {
        // Do any setup work here
    }

    override func main() {
        // Perform the task
    }

}

Version <= 2.3

class MyOperation: NSOperation {

    init(<parameters>) {
        // Do any setup work here
    }

    override func main() {
        // Perform the task
    }

}

添加操作到 OperationQueue

Version >= 1.0

myQueue.addOperation(operation)

这将在队列上同时执行操作。

管理 Operation 的依赖关系

依赖关系定义了在认为 Operation 准备好执行之前必须在队列上执行的其他 Operation

Version >= 1.0

operation2.addDependency(operation1)

operation2.removeDependency(operation1)

运行没有队列的 Operation

Version >= 1.0

   operation.start()

依赖关系将被忽略。如果这是并发操作,则如果其 start 方法将工作卸载到后台队列,则该任务仍可以同时执行。

并发运营

如果 Operation 要执行的任务本身是异步的(例如,URLSession 数据任务),则应将 Operation 实现为并发操作。在这种情况下,你的 isAsynchronous 实现应该返回 true,你通常会有 start 方法执行一些设置,然后调用它实际执行任务的 main 方法。

当实现异步 Operation 开始时,你必须实现 isExecutingisFinished 方法和 KVO。因此,当执行开始时,isExecuting 属性变为 true。当 Operation 完成任务时,isExecuting 设置为 falseisFinished 设置为 true。如果取消操作 isCancelledisFinished 都改为 true。所有这些属性都是键值可观察的。

取消 Operation

调用 cancel 只需将 isCancelled 属性更改为 true。要回复你自己的 Operation 子类中的取消,你应该至少定期在 main 中检查 isCancelled 的值并做出适当的响应。

Version >= 1.0

operation.cancel()