操作队列优先级未按预期工作

时间:2020-04-04 20:32:22

标签: ios nsoperationqueue nsoperation

我正在尝试探索Operation的queuePriority。我有三个操作对象,它们的queuePriority很高,很高和正常。但是我得到了意外的输出,在日志中我可以看到具有queuePriority的Operation对象很高,而并非总是先执行。请帮忙。

    let operationQueue = OperationQueue()
    let op1 = BlockOperation()
    let op2 = BlockOperation()
    let op0 = BlockOperation()
    op0.completionBlock = {
        print("op0 completionBlock")
    }
    op0.addExecutionBlock {
        print("op0 executionBlock #1")
    }
    op0.addExecutionBlock {
        print("op0 executionBlock #2")
    }
    op0.queuePriority = .veryHigh

    op1.completionBlock = {
        print("op1 completionBlock")
    }
    op1.addExecutionBlock {
        print("op1 executionBlock")
    }
    op1.queuePriority = .high

    op2.completionBlock = {
        print("op2 completionBlock")
    }
    op2.addExecutionBlock {
        print("op2 executionBlock")
    }
    op2.queuePriority = .normal

    operationQueue.addOperations([op2, op1, op0], waitUntilFinished: true)

输出: op1执行块 op0执行块#1 op0执行块#2 op2执行块 op1完成块 op0完成块 op2 completeBlock

1 个答案:

答案 0 :(得分:0)

如果要这种行为,则应在操作之间添加依赖项。 queuePriorites不保证执行顺序。系统尝试先执行优先级高的任务,再执行优先级低的任务,但这取决于多种因素,因此无法保证。您应该实现如下所示的依赖关系;

op2.addDependency(op1)
op1.addDependency(op0)

op2将等待op1,而op1将等待op0。因此,顺序为op0-> op1-> op2