创建高级操作
Foundation 框架提供了 Operation
类型,它表示一个高级对象,它封装了可以在队列上执行的一部分工作。队列不仅协调这些操作的性能,而且还可以在操作之间建立依赖关系,创建可取消的操作,约束操作队列使用的并发度等。
Operation
s 在所有依赖项完成执行后即可执行。然后 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
开始时,你必须实现 isExecuting
,isFinished
方法和 KVO。因此,当执行开始时,isExecuting
属性变为 true
。当 Operation
完成任务时,isExecuting
设置为 false
,isFinished
设置为 true
。如果取消操作 isCancelled
和 isFinished
都改为 true
。所有这些属性都是键值可观察的。
取消 Operation
调用 cancel
只需将 isCancelled
属性更改为 true
。要回复你自己的 Operation
子类中的取消,你应该至少定期在 main
中检查 isCancelled
的值并做出适当的响应。
Version >= 1.0
operation.cancel()