Operation
也是我们常见的多线程操作方式之一,在许多知名框架的多线程操作都是使用的Operation
这种操作方式,我们来看看Operation
的使用方式。
Operation
Operation
在我们平常开发中是不可以直接拿来是用的,我们需要自定义一个类,继承自Operation
,并实现main
方法即可。
class AsyncOperation: Operation {
override func main() {
for i in 0 ... 10 {
print("operation 1 output \(i)")
sleep(1)
}
}
}
let operation1 = AsyncOperation()
// 添加任务结束闭包,当main方法执行完成后执行该闭包
operation1.completionBlock = {
print("operation1 执行完成了!")
}
// 启动线程
operation1.start()
当我们需要operation2
在operation1
任务执行完成后执行,我们可以使用addDependency
添加依赖,当前线程可以依赖多个线程,只需要多次调用addDependency
即可
operation2.addDependency(operation1)
我们也可以设置线程的优先级,控制线程的执行优先级
public enum QueuePriority : Int {
case veryLow
case low
case normal
case high
case veryHigh
}
operation1.queuePriority = .high
BlockOperation
BlockOperation
继承自Operation
,帮我们实现了main
方法,并可以使用闭包添加多个任务,但是每个闭包的执行是无序的。
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
即线程操作队列,我们可以将线程添加到队列中执行,我们可以控制线程的执行数量和取消线程队列执行。
let queue = OperationQueue()
// 为队列添加名字,方便调试
queue.name = "queue 1"
// 添加线程1
queue.addOperation(operation1)
// 添加线程2
queue.addOperation(operation2)
当我们需要取消队列执行时使用cancle
方法即可
queue.cancle()
我们可以控制队列的最大执行并发数量,使用maxConcurrentOperationCount
控制并发数量,避免应用同一时间并发量太大导致应用消耗资源过大。
queue.maxConcurrentOperationCount = 2
Operation
并不是只有文档中的这些方法,我们还可以控制和获取线程的状态等,这些可以参考官方文档。
更好的阅读体验可以参考个人网站:https://zevwings.com