NSOperationQueue中第一个低优先级操作的顺序无效



真的很奇怪,为什么在将挂起状态更改为false后,第一个操作的位置没有改变。

let operationQueue = OperationQueue.main
let operation1 = BlockOperation { print("1") }
operation1.queuePriority = .low
let operation2 = BlockOperation { print("2") }
operation2.queuePriority = .normal
let operation3 = BlockOperation { print("3") }
operation3.queuePriority = .high
let operation4 = BlockOperation { print("4") }
operation4.queuePriority = .veryHigh
operationQueue.isSuspended = true
operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
operationQueue.addOperation(operation3)
operationQueue.addOperation(operation4)
operationQueue.isSuspended = false

打印输出:

1
4
3
2

预期打印输出:

4
3
2
1

UPD仅注意到OperationQueue.main的此行为。对于自定义OperationQueue()maxConcurrentOperationCount = 1,可以按预期工作。

不能挂起.main。这是一个系统队列。

这在底层DispatchQueue.main:的文档中有更明确的解释

与全局并发队列一样,对suspend((、resume((和dispatch_set_context(:(等的调用在此属性中的队列上使用时没有任何效果。

当您安排第一个任务时,队列是空的,它是最高优先级的,因此它会立即被安排。当队列中有挂起的任务时,它们会按优先级排序,尽管这并没有得到承诺。如果你需要一个订单,你可以使用依赖关系,而不是优先级。优先级是一个暗示,根据我的经验,除非你有一个非常专业的问题,否则通常应该避免。

在您的自定义队列的情况下,它实际上是挂起的,所以第一个任务不会在您排队时立即安排。

最新更新