Operation
也是我們常見的多線程操作方式之一,在許多知名框架的多線程操作都是使用的Operation
這種操作方式忠藤,我們來看看Operation
的使用方式。
Operation
Operation
在我們平常開發(fā)中是不可以直接拿來是用的谅河,我們需要自定義一個類框都,繼承自Operation
,并實現(xiàn)main
方法即可霎箍。
class AsyncOperation: Operation {
override func main() {
for i in 0 ... 10 {
print("operation 1 output \(i)")
sleep(1)
}
}
}
let operation1 = AsyncOperation()
// 添加任務結束閉包奇钞,當main方法執(zhí)行完成后執(zhí)行該閉包
operation1.completionBlock = {
print("operation1 執(zhí)行完成了!")
}
// 啟動線程
operation1.start()
當我們需要operation2
在operation1
任務執(zhí)行完成后執(zhí)行漂坏,我們可以使用addDependency
添加依賴景埃,當前線程可以依賴多個線程,只需要多次調用addDependency
即可
operation2.addDependency(operation1)
我們也可以設置線程的優(yōu)先級,控制線程的執(zhí)行優(yōu)先級
public enum QueuePriority : Int {
case veryLow
case low
case normal
case high
case veryHigh
}
operation1.queuePriority = .high
BlockOperation
BlockOperation
繼承自Operation
,幫我們實現(xiàn)了main
方法管跺,并可以使用閉包添加多個任務,但是每個閉包的執(zhí)行是無序的洒琢。
let operation2 = BlockOperation()
// 添加任務閉包
operation2.addExecutionBlock {
for i in 10...20 {
print("operation 2 block 1 \(i)")
sleep(1)
}
}
// 添加任務閉包
operation2.addExecutionBlock {
for i in 20...30 {
print("operation 2 block 2 \(i)")
sleep(1)
}
}
// 添加任務閉包
operation2.addExecutionBlock {
for _ in 20...30 {
print("-------------------")
sleep(1)
}
}
OperationQueue
OperationQueue
即線程操作隊列,我們可以將線程添加到隊列中執(zhí)行,我們可以控制線程的執(zhí)行數(shù)量和取消線程隊列執(zhí)行。
let queue = OperationQueue()
// 為隊列添加名字骗随,方便調試
queue.name = "queue 1"
// 添加線程1
queue.addOperation(operation1)
// 添加線程2
queue.addOperation(operation2)
當我們需要取消隊列執(zhí)行時使用cancle
方法即可
queue.cancle()
我們可以控制隊列的最大執(zhí)行并發(fā)數(shù)量,使用maxConcurrentOperationCount
控制并發(fā)數(shù)量赴叹,避免應用同一時間并發(fā)量太大導致應用消耗資源過大。
queue.maxConcurrentOperationCount = 2
Operation
并不是只有文檔中的這些方法指蚜,我們還可以控制和獲取線程的狀態(tài)等乞巧,這些可以參考官方文檔。
更好的閱讀體驗可以參考個人網(wǎng)站:https://zevwings.com