【问题标题】:Invalid order of first low priority operation in NSOperationQueueNSOperationQueue 中第一个低优先级操作的顺序无效
【发布时间】:2021-03-17 14:14:56
【问题描述】:

真的很奇怪,为什么第一个操作的位置在将挂起状态更改为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(),可以按预期工作。

【问题讨论】:

标签: ios swift nsoperationqueue


【解决方案1】:

您不能暂停.main。这是一个系统队列。

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

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

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

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

【讨论】:

  • 谢谢!但是为什么我没有看到以下输出: [1, 2, 3, 4] 那么呢? 2-4 操作按适当的优先级排序。
  • 因为在主队列中加了1的时候,里面什么都没有了(而且主队列也不能挂起),所以可能刚开始。但是 2-4 将倾向于反映他们的优先级(尽管不能保证,正如 Rob Napier 所说)。但正如他所说,如果您必须让它们按特定顺序运行,请不要使用优先级;使用依赖项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
相关资源
最近更新 更多