Swift-Operation基础

2,086 阅读1分钟

本篇内容多线程相关

一.Operation的执行任务方式

使用BlockOperation,代码如下:

    func testBlockOp()  {
    //任务
        let op = BlockOperation()
        op.addExecutionBlock {
            for i in 0...10{
                print("A--\(i)")
            }
        }
        op.addExecutionBlock {
            for i in 0...20{
                print("B--\(i)")
            }
        }
        op.addExecutionBlock {
            for i in 0...30{
                print("C--\(i)")
            }
        }
        op.start()
        //后续测试代码
        print("end")
    }

打印结果为op的三个具体任务完成之后,才打印后续测试代码end.由此证明Operation的执行方式为串行.

二.Operation依赖关系

使用OperationQueue测试依赖关系,代码如下:

    //测试op依赖关系
    //A,B - C
    //C,D - E
    func testDependency(){
        let opA = BlockOperation()
        let opB = BlockOperation()
        let opC = BlockOperation()
        let opD = BlockOperation()
        let opE = BlockOperation()
        opA.addExecutionBlock {
            for i in 0...10{
                if i == 10{
                    print("A--\(i)")
                }
            }
        }
        opB.addExecutionBlock {
            for i in 0...10{
                if i == 10{
                    print("B--\(i)")
                }
            }
        }
        opC.addExecutionBlock {
            for i in 0...10{
                if i == 10{
                    print("C--\(i)")
                }
            }
        }
        opD.addExecutionBlock {
            for i in 0...10{
                if i == 10{
                    print("D--\(i)")
                }
            }

        }
        opE.addExecutionBlock {
            for i in 0...10{
                if i == 10{
                    print("E--\(i)")
                }
            }
        }
        opC.addDependency(opA)
        opC.addDependency(opB)
        opE.addDependency(opC)
        opE.addDependency(opD)
        let queue = OperationQueue()
        queue.maxConcurrentOperationCount = 6
        queue.addOperations([opA,opB,opC,opD,opE], waitUntilFinished: false)
        print("end")
    }

打印结果为与预设的依赖关系一致.

三.Operation优先级

使用OperationQueue测试依赖关系,代码如下:

    func testQueuePriority(){
        let opA = BlockOperation()
        let opB = BlockOperation()
        let opC = BlockOperation()
        opA.addExecutionBlock {
            for i in 0...10{
                print("A--\(i)")
            }
        }
        opB.addExecutionBlock {
            for i in 0...10{
                print("B--\(i)")
            }
        }
        opC.addExecutionBlock {
            for i in 0...10{
                print("C--\(i)")
            }
        }
        opA.queuePriority = .low
        opB.queuePriority = .high
        opC.queuePriority = .normal
        let queue = OperationQueue()
        queue.maxConcurrentOperationCount = 2
        queue.addOperations([opA, opB, opC], waitUntilFinished: false)
    }

根据打印结果总结:

  • 队列的并发数<任务个数, 先执行任务的队列优先级高的.
  • 队列的并发数>任务个数, 所有任务一起执行.