0. 前言
NSOperation 是蘋果在 GCD 上的封裝兆龙,NSOperation 相對于 GCD 而言扶檐,在處理數(shù)量較大的并發(fā)時比較牛逼一點迹缀,但是速度稍微比 GCD 慢一丟丟。
NSOperation 現(xiàn)在在 Swift 里已經(jīng)被改名成了 Operation种远。
Operation 將線程的管理和數(shù)據(jù)的同步問題完成了涩澡,所以我們只需要把我們想要干的事情搞好就可以了。
1. 使用 Operation
Operation 是一個 抽象類 坠敷,所以我們在使用的時候妙同,要不就 寫一個子類 來實現(xiàn)它,要不就用它已經(jīng) 定義好的子類 膝迎。這個時候會接觸到一個叫 OperationQueue 的隊列粥帚,需要我們創(chuàng)建好 Operation 的對象之后,把這個對象丟到 OperationQueue 里面去執(zhí)行弄抬。
定義好的子類
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. 基礎(chǔ)操作
Operation 添加
operationQueue.addOperation(anOperationToAdd)
Operation 回調(diào)
// 這個時候又會看到金光閃閃的一個 block ...
// 回調(diào)就是在 Operation 完成之后大喊一聲 “我完事兒了” 表示任務(wù)結(jié)束...
operation.completionBlock = { () -> Void in
print("I'm done!")
}
Operation 依賴
假如說有好幾個 Operation 的對象旅敷,當(dāng)它們需要按照一定的順序執(zhí)行团滥,或者說它們的工作內(nèi)容需要其他 Operation 的結(jié)果的時候论衍,就需要給 Operation 間添加依賴關(guān)系凹耙。
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)
// 隊列創(chuàng)建和操作添加椎组,添加順序無所謂
let dependencyQueue = OperationQueue()
dependencyQueue.addOperation(operation1)
dependencyQueue.addOperation(operation2)
Operation 取消
// 取消隊列中的所有 Operation 操作
operationQueue.cancelAllOperation()
OperationQueue 并發(fā)上限設(shè)置
// 設(shè)置最大并發(fā)操作數(shù)為 7 奋献,默認(rèn)為 -1 表示無限制
operationQueue.maxConcurrentOperationCount = 7