当前位置: 首页 > 知识库问答 >
问题:

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

乐正乐湛
2023-03-14

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

共有1个答案

解宏扬
2023-03-14

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

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

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

当您调度第一个任务时,队列是空的,并且它是最高优先级的,因此它被立即调度。当队列中有挂起的任务时,它们会按优先级排序,尽管这并不是承诺的。如果需要顺序,则使用依赖项,而不是优先级。优先级是一个提示,根据我的经验,通常应该避免,除非你有一个非常特殊的问题。

在自定义队列的情况下,它实际上是挂起的,因此第一个任务不会在您对其进行排队时立即得到调度。

 类似资料:
  • 操作符优先级 就像我们在第四章中讲解的,JavaScript版本的&&和||很有趣,因为它们选择并返回它们的操作数之一,而不是仅仅得出true或false的结果。如果只有两个操作数和一个操作符,这很容易推理。 var a = 42; var b = "foo"; a && b; // "foo" a || b; // 42 但是如果牵扯到两个操作符,和三个操作数呢? var a = 4

  • 问题内容: 我想了解express.js中的顺序优先级。例如,下面的代码 如果请求来自客户端localhost:3000 / api / abc和localhost:3000 / user / abc,则来自api和用户模块的响应。但是,如果我发出类似localhost:3000 / myName / xyz的请求,则应用程序模块将返回响应。此行为使我担心expressjs的优先顺序以及路由器模块

  • 1) 当我将它输入到python解释器中时,我得到的输出是“this”,然后是零除法错误。但是,我引用的站点提到函数调用是第二高的优先级,所以不是应该先执行print的两个函数调用吗?我知道有短路评估,但这不是只有当你达到and、nots和OR的优先级时才会起作用吗? 2) 有人能解释一下我遗漏了什么,以及如何判断python将按照什么顺序执行一个逻辑表达式吗?

  • 我正在研究一种算法,在该算法中,我希望在从该优先级队列中删除元素时,保持优先级队列中具有相同优先级的元素的FIFO顺序。 虽然,我已经看到了将自动递增的序列号作为辅助键的解决方案,并使用它来打破联系,但我需要类似的链接,但我面临的问题是,我想要比较的元素-TestItemChange(下面示例中的类)没有实现Compariable,我无法(也不想)修改它以使其实现。所以现在,在优先级队列中没有FI

  • 优先级队列未维护排序顺序我是否未正确执行?输出时出现错误的排序顺序? 产出:[1, 5, 8, 19, 9]

  • 我试图限制用户使用我的桶策略访问我的桶。我有一组用户,他们都有一个S3FullAccess策略。我不能改变IAM中的任何东西。我只能使用我的遗愿保单。所以我想使用桶策略控制用户的访问。我把用户分成3类。 管理员访问我的桶(所有访问我的桶) 访问我的桶的权限有限的用户(如get-buk-策略,get-buk-位置) 无法访问我的桶。(无法访问我的桶) 下面的策略是我尝试过的,但不起作用。 我尝试了上