繁体   English   中英

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

[英]Invalid order of first low priority operation in NSOperationQueue

真的很想知道,为什么将暂停的 state 更改为false后,第一次操作的 position 没有更改。

    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

打印 output:

1
4
3
2

预期打印 output:

4
3
2
1

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

您不能暂停.main 那是系统队列。

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

与全局并发队列一样,对 suspend()、resume()、dispatch_set_context( : :) 等的调用在用于此属性中的队列时无效。

当你调度第一个任务时,队列是空的,它是最高优先级的,所以它立即被调度。 当队列中有待处理的任务时,它们会按优先级排序,尽管这不是承诺的。 如果您需要订单,则使用依赖项,而不是优先级。 优先级是一个提示,根据我的经验,除非您遇到非常专业的问题,否则通常应该避免优先级。

对于您的自定义队列,它确实被挂起,因此第一个任务不会在您入队后立即安排。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM