NSOperationQueue 中第一个低优先级操作的顺序无效
Invalid order of first low priority operation in 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
注意到此行为。对于带有 maxConcurrentOperationCount = 1
的自定义 OperationQueue()
按预期工作。
您无法暂停 .main
。那是一个系统队列。
这在底层文档中有更明确的解释 DispatchQueue.main
:
As with the global concurrent queues, calls to suspend(), resume(), dispatch_set_context(::), and the like have no effect when used on the queue in this property.
当你安排第一个任务时,队列是空的,而且它的优先级最高,所以立即安排。当队列中有待处理的任务时,它们会按优先级排序,尽管这不是承诺的。如果你需要一个顺序,你使用依赖关系,而不是优先级。优先级是一个提示,根据我的经验,通常应该避免,除非你有一个非常专业的问题。
在您的自定义队列的情况下,它确实被挂起,因此第一个任务不会在您入队后立即安排。
很纳闷,为什么把挂起状态改成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
注意到此行为。对于带有 maxConcurrentOperationCount = 1
的自定义 OperationQueue()
按预期工作。
您无法暂停 .main
。那是一个系统队列。
这在底层文档中有更明确的解释 DispatchQueue.main
:
As with the global concurrent queues, calls to suspend(), resume(), dispatch_set_context(::), and the like have no effect when used on the queue in this property.
当你安排第一个任务时,队列是空的,而且它的优先级最高,所以立即安排。当队列中有待处理的任务时,它们会按优先级排序,尽管这不是承诺的。如果你需要一个顺序,你使用依赖关系,而不是优先级。优先级是一个提示,根据我的经验,通常应该避免,除非你有一个非常专业的问题。
在您的自定义队列的情况下,它确实被挂起,因此第一个任务不会在您入队后立即安排。