Очередь операций Приоритет не работает должным образом - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь изучить очередь, приоритет операции. У меня есть три объекта Operation с queuePriority очень высокой, высокой и нормальной. Но я получаю неожиданный вывод, в журнале я вижу объекты Operation с queuePriority очень высокими, которые не всегда выполняются первыми. Пожалуйста, помогите.

    let operationQueue = OperationQueue()
    let op1 = BlockOperation()
    let op2 = BlockOperation()
    let op0 = BlockOperation()
    op0.completionBlock = {
        print("op0 completionBlock")
    }
    op0.addExecutionBlock {
        print("op0 executionBlock #1")
    }
    op0.addExecutionBlock {
        print("op0 executionBlock #2")
    }
    op0.queuePriority = .veryHigh

    op1.completionBlock = {
        print("op1 completionBlock")
    }
    op1.addExecutionBlock {
        print("op1 executionBlock")
    }
    op1.queuePriority = .high

    op2.completionBlock = {
        print("op2 completionBlock")
    }
    op2.addExecutionBlock {
        print("op2 executionBlock")
    }
    op2.queuePriority = .normal

    operationQueue.addOperations([op2, op1, op0], waitUntilFinished: true)

Вывод: выполнение op1Block op0 выполнениеBlock # 1 op0 выполнениеBlock # 2 op2 выполнениеBlock op1 завершениеBlock op0 завершениеBlock op2 завершениеБлок

1 Ответ

0 голосов
/ 20 апреля 2020

Если вы хотите такого рода поведение, вы должны добавить зависимости между операциями. queuePriorites не гарантирует выполнение заказа. Система пытается выполнить задачи с высоким приоритетом перед задачами с низким приоритетом, но это зависит от различных факторов, и нет никакой гарантии. Вы должны реализовать зависимости, как показано ниже:

op2.addDependency(op1)
op1.addDependency(op0)

op2 будет ждать op1, а op1 будет ждать op0. Итак, порядок будет op0 -> op1 -> op2

...