【问题标题】:Operation queuePriority not working as expected操作 queuePriority 未按预期工作
【发布时间】:2020-04-04 20:32:22
【问题描述】:

我正在尝试探索 queuePriority of Operation。我有三个具有 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 完成块

【问题讨论】:

    标签: ios nsoperationqueue nsoperation


    【解决方案1】:

    如果你想要这种行为,你应该在操作之间添加依赖。 queuePriorites 不保证执行顺序。系统尝试在低优先级任务之前执行高优先级任务,但这取决于各种因素,无法保证。您应该像下面这样实现依赖项;

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

    op2 将等待 op1,op1 将等待 op0。所以,顺序是 op0 -> op1 -> op2

    【讨论】:

    • 谢谢。你能举个例子什么时候使用队列优先级。
    • 假设我们有一个表格视图,我们正在为每个单元格下载图像。当单元格变得可见时,我们开始下载。当用户滚动时,一些单元格会离开屏幕并变得不可见。在这种情况下,我们可以取消对不可见单元格的操作,或者我们可以检查队列并将操作优先级更改为低。但我们只能在该操作在队列中等待并且尚未开始时进行更改。例如,我们有 100 个单元格,用户滚动速度非常快。我们创建了 100 个操作,其中一些在开始之前变得不可见。
    猜你喜欢
    • 2012-08-25
    • 2020-09-27
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多