一横朋、NSOperation子類
NSOperation是一個抽象類,并不具備封裝操作的能力,必須使用它的子類
1松忍、NSInvocationOperation(Swift不支持)
默認是不會開啟線程的,只會在當前的線程中執(zhí)行操作,可以通過Operation和OperationQueue實現(xiàn)多線程
2怜俐、BlockOperation:
只要BlockOperation封裝的操作數(shù) > 1,就會異步執(zhí)行操作,但是不會無限制的創(chuàng)建線程
let blockOpe = BlockOperation()
blockOpe.queuePriority = .veryHigh
blockOpe.addExecutionBlock {
print("BlockOperation執(zhí)行了",Thread.current)
}
blockOpe.addExecutionBlock {
print("BlockOperation2執(zhí)行了",Thread.current)
}
blockOpe.start() //開始執(zhí)行
//blockOpe.cancel() //取消
二之剧、NSOperationQueue
1佣耐、創(chuàng)建隊列
獲取主隊列以及添加操作到隊列嘀倒,主隊列是串行隊列,無論是否設置最大并行數(shù)量都是在當前線程執(zhí)行,不會創(chuàng)建新的線程
let queue = OperationQueue.main
queue.addOperation {}
同時具備串行和并發(fā)的功能,默認情況下是并發(fā)的,可以手動設置為串行隊列,通過設置最大并發(fā)數(shù)屬性來更改
let queue = OperationQueue()
queue.maxConcurrentOperationCount = 1
queue.addOperation {
for _ in 0...50000{
print("OperationQueue1執(zhí)行了",Thread.current)
}
}
//addOperation已經(jīng)在內(nèi)部執(zhí)行了start方法了
2鸽疾、最大并發(fā)數(shù)
1吊洼、取消隊列中的所有任務,除了正在執(zhí)行的任務,一旦被取消,就不能回復之前的操作。
2制肮、將最大操作數(shù)的值設置為1,可以實現(xiàn)任務的串行效果,但是要注意的是,并不是只開一條子線程(通常會開兩條子線程,循環(huán)回收復用)
3冒窍、最大并發(fā)數(shù)6以內(nèi),不要開太多豺鼻,因為雖然任務是在子線程進行處理的综液,但是cpu處理這些過多的子線程可能會影響UI,讓UI卡頓儒飒。
queue.maxConcurrentOperationCount=2;
3谬莹、隊列的取消
當前正在處于執(zhí)行狀態(tài)的任務是不能夠取消的,只能取消等待的任務
queue.cancelAllOperations()
4、隊列的掛起和恢復
當前正在處于執(zhí)行狀態(tài)的任務是不能夠暫停的,只能暫停等待的任務
queue.isSuspended = true //暫停隊列
queue.isSuspended = false //恢復隊列
5桩了、等待Options完成
如果需要在當前線程中處理operation完成后的結(jié)果,可以使用NSOperation的waitUntilFinished方法阻塞當前線程附帽,等待operation完成
// 會阻塞當前線程,等到某個operation執(zhí)行完畢
[operation waitUntilFinished];
使用NSOperationQueue的waitUntilAllOperationsAreFinished方法
// 阻塞當前線程井誉,等待queue的所有操作執(zhí)行完畢
[queue waitUntilAllOperationsAreFinished];
6士葫、添加NSOperation的依賴對象
當某個NSOperation對象依賴于其它NSOperation對象的完成時,就可以通過addDependency
方法添加一個或者多個依賴的對象送悔,只有所有依賴的對象都已經(jīng)完成操作,當前NSOperation對象才會開始執(zhí)行操作爪模。另外欠啤,通過removeDependency
方法來刪除依賴對象。
//設置依賴關(guān)系
let blockOpe1 = BlockOperation()
blockOpe1.addExecutionBlock {
print("blockOpe1執(zhí)行了")
}
let blockOpe2 = BlockOperation()
blockOpe2.addExecutionBlock {
print("blockOpe2執(zhí)行了")
}
blockOpe1.addDependency(blockOpe2)
queue.addOperation(blockOpe1)
queue.addOperation(blockOpe2)
可以看出屋灌,先執(zhí)行blockOpe2洁段,再執(zhí)行blockOpe1
7、修改Operations的執(zhí)行順序
默認所有operation都擁有“普通”優(yōu)先級,不過可以通過setQueuePriority:方法來提升或降低operation對象的優(yōu)先級共郭。
let blockOpe = BlockOperation()
blockOpe.queuePriority = .low
queue.addOperation(blockOpe)