從使用場(chǎng)景來說,Operation與GCD最大的區(qū)別在于__ 面向?qū)ο蟮腛peration可以很好的復(fù)用代碼__。
所以如果你的多線程開發(fā)的代碼是只用執(zhí)行一次就結(jié)束了的話還是用GCD比較方便快捷
Operation States
-
isReady
。這個(gè)狀態(tài)表示Operation實(shí)例初始化成功,可以接活兒了。 -
isExecuting
。這個(gè)狀態(tài)表示正在運(yùn)行,發(fā)生在調(diào)用start()
方法之后 -
isCanceled
。如果cancel()
方法被調(diào)用,那么Operation實(shí)例就會(huì)切換到這個(gè)狀態(tài)。 -
isFinished
。即正常運(yùn)行結(jié)束。
這個(gè)只讀屬性除了調(diào)用start()
和cancel()
可以被我們主動(dòng)影響外,其它都是由底層直接控制。
Block Operation
執(zhí)行一個(gè)任務(wù)的話直接用閉包把任務(wù)寫在BlockOperation
初始化方法中即可,
let operation = BlockOperation {
print("測(cè)試任務(wù)輸出")
}
BlockOperation
在默認(rèn)的全局并發(fā)隊(duì)列上執(zhí)行,而且可以像DispatchGroup
一樣管理批量的任務(wù)。
BlockOperation
如果想要串行多個(gè)任務(wù),需要設(shè)置依賴或者在DispatchQueue
出來的串行隊(duì)列執(zhí)行。
多任務(wù)
下面的例子展示了BlockOperation
的多任務(wù)創(chuàng)建
let numbers = [1, 2, 3, 4, 5]
let operation = BlockOperation()
for number in numbers {
operation.addExecutionBlock {
print("任務(wù)\(number)運(yùn)行在線程\(Thread.current)")
sleep(1)
}
}
operation.completionBlock = {
print("任務(wù)全部完成")
}
// 測(cè)試運(yùn)行時(shí)間
let startTime = Date()
operation.start()
print("任務(wù)時(shí)間: \(Date().timeIntervalSince(startTime))")
輸出
任務(wù)1運(yùn)行在線程<NSThread: 0x60000077a200>{number = 1, name = main}
任務(wù)4運(yùn)行在線程<NSThread: 0x600000740340>{number = 3, name = (null)}
任務(wù)2運(yùn)行在線程<NSThread: 0x6000007668c0>{number = 7, name = (null)}
任務(wù)3運(yùn)行在線程<NSThread: 0x600000758080>{number = 5, name = (null)}
任務(wù)5運(yùn)行在線程<NSThread: 0x60000073d480>{number = 8, name = (null)}
任務(wù)全部完成
任務(wù)時(shí)間: 1.0200040340423584
上面12345的輸出順序是不能確定的,因?yàn)樗鼈儾l(fā)運(yùn)行在多個(gè)線程上。
自定義Operation子類
基礎(chǔ)用法
class ExampleOperation: Operation {
override func main() { // start()方法會(huì)調(diào)用
}
}
更多用法以及討論請(qǐng)看本系列下一篇
系列文章鏈接
- Swift多線程開發(fā) - 1. 概述
- Swift多線程開發(fā) - 2. GCD 隊(duì)列和線程
- Swift多線程開發(fā) - 3. DispatchGroup和Semaphore
- Swift多線程開發(fā) - 4. 多線程開發(fā)的問題
- Swift多線程開發(fā) - 5. Operations
- Swift多線程開發(fā) - 6. Operation 隊(duì)列
- Swift多線程開發(fā) - 7. Operation 異步隊(duì)列
- Swift多線程開發(fā) - 8. Operation依賴
- Swift多線程開發(fā) - 9. 取消Operation
- Swift多線程開發(fā) - 10. Thread Sanitizer