Swift Operation和OperationQueue

1,011 阅读1分钟
Operation
  • 默认在主线程执行
let mainOperation = BlockOperation {
    print(Thread.current) // 主线程
}
mainOperation.start()
<NSThread: 0x600000820080>{number = 1, name = main}
  • 自定义Operation
class CustomOperation: Operation {

    override func main() {
        if isCancelled == false {
            print("CustomOperation = \(Thread.current)") // 主线程
        }
    }
}
  • 默认也是在主线程执行
let customOperation = CustomOperation()
customOperation.start()
CustomOperation = <NSThread: 0x6000031c4600>{number = 1, name = main}
  • 其中一个在主线程其他都在子线程,⚠️第一个不一定是在子线程,主线程是随机的
let blcokOperation = BlockOperation {
    print("1 - \(Thread.current)")
}
blcokOperation.addExecutionBlock {
    print("2 - \(Thread.current)")
}
blcokOperation.addExecutionBlock {
    print("3 - \(Thread.current)")
}
blcokOperation.addExecutionBlock {
    print("4 - \(Thread.current)")
}
blcokOperation.start()
3 - <NSThread: 0x6000036409c0>{number = 1, name = main}
4 - <NSThread: 0x60000364f4c0>{number = 4, name = (null)}
2 - <NSThread: 0x60000360acc0>{number = 3, name = (null)}
1 - <NSThread: 0x60000360dac0>{number = 5, name = (null)}
OperationQueue 队列
  • 主线程队列
let mainQueue = OperationQueue.main
let operation1 = BlockOperation {
    print("队列1 = \(Thread.current)")
}
let operation2 = BlockOperation {
    print("队列2 = \(Thread.current)")
}
let operation3 = BlockOperation {
    print("队列3 = \(Thread.current)")
}
mainQueue.addOperation(operation1)
mainQueue.addOperation(operation2)
mainQueue.addOperation(operation3)
队列1 = <NSThread: 0x6000035fc9c0>{number = 1, name = main}
队列2 = <NSThread: 0x6000035fc9c0>{number = 1, name = main}
队列3 = <NSThread: 0x6000035fc9c0>{number = 1, name = main}
  • 自定义子线程队列 , 设置最大并发数为1时为串行队列
let queue = OperationQueue()
// 最大并发数 
queue.maxConcurrentOperationCount = 1
let operation1 = BlockOperation {
    print("队列1 = \(Thread.current)")
}
let operation2 = BlockOperation {
    print("队列2 = \(Thread.current)")
}
let operation3 = BlockOperation {
    print("队列3 = \(Thread.current)")
}
let operation4 = BlockOperation {
    print("队列4 = \(Thread.current)")
}
queue.addOperation(operation1)
queue.addOperation(operation2)
queue.addOperation(operation3)
queue.addOperation(operation4)
  • 操作依赖 只有当操作1执行完后再执行操作2
let queue = OperationQueue()
        
let operation1 = BlockOperation {
    print("队列1 = \(Thread.current)")
}
let operation2 = BlockOperation {
    print("队列2 = \(Thread.current)")
}
operation2.addDependency(operation1)
        
queue.addOperation(operation1)
queue.addOperation(operation2)
  • 子线程回到主线程操作
let queue = OperationQueue()
queue.addBarrierBlock {
    print(Thread.current)
            
    OperationQueue.main.addOperation {
        print(Thread.current)
    }
}