微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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(::) 等的调用在此属性中的队列上使用时无效。>

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。