Swift 多线程开发 - 5. Operations
2020-04-04 本文已影响0人
JaiUnChat
从使用场景来说,Operation与GCD最大的区别在于__ 面向对象的Operation可以很好的复用代码__。
所以如果你的多线程开发的代码是只用执行一次就结束了的话还是用GCD比较方便快捷
Operation States
-
isReady
。这个状态表示Operation实例初始化成功,可以接活儿了。 -
isExecuting
。这个状态表示正在运行,发生在调用start()
方法之后 -
isCanceled
。如果cancel()
方法被调用,那么Operation实例就会切换到这个状态。 -
isFinished
。即正常运行结束。
这个只读属性除了调用start()
和cancel()
可以被我们主动影响外,其它都是由底层直接控制。
Block Operation
执行一个任务的话直接用闭包把任务写在BlockOperation
初始化方法中即可,
let operation = BlockOperation {
print("测试任务输出")
}
BlockOperation
在默认的全局并发队列上执行,而且可以像DispatchGroup
一样管理批量的任务。
BlockOperation
如果想要串行多个任务,需要设置依赖或者在DispatchQueue
出来的串行队列执行。
多任务
下面的例子展示了BlockOperation
的多任务创建
let numbers = [1, 2, 3, 4, 5]
let operation = BlockOperation()
for number in numbers {
operation.addExecutionBlock {
print("任务\(number)运行在线程\(Thread.current)")
sleep(1)
}
}
operation.completionBlock = {
print("任务全部完成")
}
// 测试运行时间
let startTime = Date()
operation.start()
print("任务时间: \(Date().timeIntervalSince(startTime))")
输出
任务1运行在线程<NSThread: 0x60000077a200>{number = 1, name = main}
任务4运行在线程<NSThread: 0x600000740340>{number = 3, name = (null)}
任务2运行在线程<NSThread: 0x6000007668c0>{number = 7, name = (null)}
任务3运行在线程<NSThread: 0x600000758080>{number = 5, name = (null)}
任务5运行在线程<NSThread: 0x60000073d480>{number = 8, name = (null)}
任务全部完成
任务时间: 1.0200040340423584
上面12345的输出顺序是不能确定的,因为它们并发运行在多个线程上。
自定义Operation子类
基础用法
class ExampleOperation: Operation {
override func main() { // start()方法会调用
}
}
更多用法以及讨论请看本系列下一篇
系列文章链接