0. 前言
NSOperation 是苹果在 GCD 上的封装,NSOperation 相对于 GCD 而言,在处理数量较大的并发时比较牛逼一点,但是速度稍微比 GCD 慢一丢丢。
NSOperation 现在在 Swift 里已经被改名成了 Operation。
Operation 将线程的管理和数据的同步问题完成了,所以我们只需要把我们想要干的事情搞好就可以了。
1. 使用 Operation
Operation 是一个 抽象类 ,所以我们在使用的时候,要不就 写一个子类 来实现它,要不就用它已经 定义好的子类 。这个时候会接触到一个叫 OperationQueue 的队列,需要我们创建好 Operation 的对象之后,把这个对象丢到 OperationQueue 里面去执行。
定义好的子类
Operation 里面自带的一个子类叫 BlockOperation。看到 block 就知道这个东西又是从 Objective-C 搞过来的...
class ViewController : UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let blockOperation = BlockOperation(block: { [weak self] in
self?.printMessage()
return
})
let operationQueue = OperationQueue()
operationQueue.addOperation(blockOperation)
}
func printMessage() {
print("I'm BlockOperation.")
}
}
自己写的子类
class ViewController : UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let customizeOperation = customizeOperation()
let operationQueue = OperationQueue()
operationQueue.addOperation(customizeOperation)
}
}
class CustomizeOperation: Operation {
override func main() {
print("I'm CustomizeOperation!")
}
}
2. 基础操作
Operation 添加
operationQueue.addOperation(anOperationToAdd)
Operation 回调
// 这个时候又会看到金光闪闪的一个 block ...
// 回调就是在 Operation 完成之后大喊一声 “我完事儿了” 表示任务结束...
operation.completionBlock = { () -> Void in
print("I'm done!")
}
Operation 依赖
假如说有好几个 Operation 的对象,当它们需要按照一定的顺序执行,或者说它们的工作内容需要其他 Operation 的结果的时候,就需要给 Operation 间添加依赖关系。
let operation1 = BlockOperation {
// I will do my job when operation2 is completed.
}
let operation2 = BlockOperation {
// I'm gonna do my job so that operation1 can do its job.
}
// operation1 依赖于 operation2
operation1.addDependency(operation2)
// 队列创建和操作添加,添加顺序无所谓
let dependencyQueue = OperationQueue()
dependencyQueue.addOperation(operation1)
dependencyQueue.addOperation(operation2)
Operation 取消
// 取消队列中的所有 Operation 操作
operationQueue.cancelAllOperation()
OperationQueue 并发上限设置
// 设置最大并发操作数为 7 ,默认为 -1 表示无限制
operationQueue.maxConcurrentOperationCount = 7