介紹:
NSOperation是基于GCD實現(xiàn)员咽,封裝了一些更為簡單實用的功能,因為GCD的線程生命周期是自動管理贮预,所以NSOperation也是自動管理贝室。NSOperation配合NSOperationQueue也可以實現(xiàn)多線程。
實現(xiàn)步驟
第1步:將一個操作封裝到NSOperation對象中
第2步:將NSOperation對象放入NSOperationQueue隊列
第3步:NSOperationQueue自動取出隊列中的NSOperation對象放到一條線程中執(zhí)行
具體實現(xiàn)
在swift中的實現(xiàn)方式分2種(oc還多了一個NSInvocationOperation仿吞,并且在oc中NSOperation是個抽象類):
1.NSBlockOperation
2.自定義子類繼承NSOperation
1.NSOoperation常用操作滑频,創(chuàng)建隊列,設(shè)置最大并發(fā)數(shù)
//創(chuàng)建隊列
let queue = NSOperationQueue()
//設(shè)置最大并發(fā)數(shù)
queue.maxConcurrentOperationCount=2
//創(chuàng)建operation
let operation = NSBlockOperation { () -> Void in
print("doSomething1 \(NSThread.currentThread())")
}
//當operation有多個任務(wù)的時候會自動分配多個線程并發(fā)執(zhí)行,
//如果只有一個任務(wù)唤冈,會自動在主線程同步執(zhí)行
//operation.start()
operation.addExecutionBlock { () -> Void in
print("doSomething2 \(NSThread.currentThread())")
}
operation.addExecutionBlock { () -> Void in
print("doSomething3 \(NSThread.currentThread())")
}
let operation2=NSBlockOperation { () -> Void in
print("doSomething4 \(NSThread.currentThread())")
}
//添加到隊列中的operation將自動異步執(zhí)行
queue.addOperation(operation)
queue.addOperation(operation2)
//還有一種方式误趴,直接將operation的blcok直接加入到隊列
queue.addOperationWithBlock { () -> Void in
print("doSomething5 block \(NSThread.currentThread())")
}
queue.addOperationWithBlock { () -> Void in
print("doSomething6 block \(NSThread.currentThread())")
}
queue.addOperationWithBlock { () -> Void in
print("doSomething7 block \(NSThread.currentThread())")
}
queue.addOperationWithBlock { () -> Void in
print("doSomething8 block \(NSThread.currentThread())")
}
2.NSOperation操作依賴,可設(shè)置一個操作在另一個操作完成后在執(zhí)行
//創(chuàng)建隊列
let queue = NSOperationQueue()
let operationA = NSBlockOperation { () -> Void in
print("print A")
}
let operationB = NSBlockOperation { () -> Void in
print("print B")
}
let operationC = NSBlockOperation { () -> Void in
print("print C")
}
//B等A執(zhí)行完才執(zhí)行
operationB.addDependency(operationA)
//C等B執(zhí)行完才執(zhí)行
operationC.addDependency(operationB)
queue.addOperation(operationA)
queue.addOperation(operationB)
queue.addOperation(operationC)
3.NSOperation操作監(jiān)聽务傲,一個操作完成后調(diào)用另一個操作:
func operationCompletion(){
//創(chuàng)建隊列
let queue = NSOperationQueue()
let operation = NSBlockOperation { () -> Void in
print("print A")
}
operation.completionBlock = doSomething
queue.addOperation(operation)
}
func doSomething(){
print("doSomething")
}
4.NSOperation線程通信凉当,NSOperationQueue.mainQueue枣申。
//創(chuàng)建隊列
let queue = NSOperationQueue()
queue.addOperationWithBlock { () -> Void in
print("子線程 \(NSThread.currentThread())")
NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
print("主線程 \(NSThread.currentThread())")
})
}
注意:
1.在使用隊列任務(wù)的時候,內(nèi)存警告的時候可使用隊列的cancelAllOperations函數(shù)取消所有操作看杭,注意一旦取消不可恢復(fù)忠藤。亦可設(shè)置隊列的suspended屬性暫停和恢復(fù)隊列。
2.在設(shè)置操作依賴的時候不能設(shè)置循環(huán)依賴楼雹。
轉(zhuǎn) Swift多線程NSOperation的使用