本文主要是介绍swift之NSOperation的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
NSOperation是基于GCD实现,封装了一些更为简单实用的功能,因为GCD的线程生命周期是自动管理,所以NSOperation也是自动管理。NSOperation配合NSOperationQueue也可以实现多线程。
实现步骤:
第1步:将一个操作封装到NSOperation对象中
第2步:将NSOperation对象放入NSOperationQueue队列
第3步:NSOperationQueue自动取出队列中的NSOperation对象放到一条线程中执行
具体实现
在swift中的实现方式分2种(oc还多了一个NSInvocationOperation,并且在oc中NSOperation是个抽象类):
1.NSBlockOperation
2.自定义子类继承NSOperation
=============1.NSOoperation常用操作,创建队列,设置最大并发数。
//创建队列
let queue = OperationQueue()
//设置最大并发数
queue.maxConcurrentOperationCount=2
//创建operation
let operation = BlockOperation.init {
print("doSomething1 \(Thread.current)")
}
let operation2=BlockOperation.init {
print("doSomething4 \(Thread.current)")
}
//添加到队列中的operation将自动异步执行
queue.addOperation(operation)
queue.addOperation(operation2)
//当operation有多个任务的时候会自动分配多个线程并发执行,
//如果只有一个任务,会自动在主线程同步执行
//operation.start()
operation.addExecutionBlock {
print("doSomething2 \(Thread.current)")
}
operation.addExecutionBlock {
print("doSomething3 \(Thread.current)")
}
**************//还有一种方式,直接将operation的blcok直接加入到队列
queue.addOperation {
print("doSomething5 \(Thread.current)")
}
queue.addOperation {
print("doSomething6 \(Thread.current)")
}
queue.addOperation {
print("doSomething7 \(Thread.current)")
}
queue.addOperation {
print("doSomething8 \(Thread.current)")
}
========== 2.NSOperation操作依赖,可设置一个操作在另一个操作完成后在执行
//创建队列
let queue = OperationQueue.init()
let operationA = BlockOperation.init
{
print("print A")
}
let operationB = BlockOperation.init
{
print("print B")
}
let operationC = BlockOperation.init
{
print("print C")
}
//B等A执行完才执行
operationB.addDependency(operationA)
//C等B执行完才执行
operationC.addDependency(operationB)
queue.addOperation(operationA)
queue.addOperation(operationB)
queue.addOperation(operationC)
=========== // 3.NSOperation操作监听,一个操作完成后调用另一个操作:==========
func operationCompletion(){
//创建队列
let queue = OperationQueue()
let operation = BlockOperation.init {
}
operation.completionBlock = doSomething
queue.addOperation(operation)
}
func doSomething(){
print("doSomething")
}
========= 4.NSOperation线程通信,NSOperationQueue.mainQueue。
let queue = OperationQueue.init()
queue.addOperation { () -> Void in
print("子线程 \(Thread.current)")
OperationQueue.main.addOperation({
print("主线程 \(Thread.current)")
})
}
}
注意:
1.在使用队列任务的时候,内存警告的时候可使用队列的cancelAllOperations函数取消所有操作,注意一旦取消不可恢复。亦可设置队列的suspended属性暂停和恢复队列。
2.在设置操作依赖的时候不能设置循环依赖。
这篇关于swift之NSOperation的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!