Может ли задача быстрого параллелизма быть сохранена в очереди и запущена позже?

#swift #task #swift-concurrency

#swift #задача #swift-concurrency

Вопрос:

Мне нужно отложить выполнение задачи до тех пор, пока я не выполню задачу с высоким приоритетом, такую как повторная аутентификация, а затем выполнить исходную задачу оттуда. Я пытаюсь использовать объект задачи Swift Concurrency для этого:

 Task {
    await service.fetch(...)
}
 

Я вижу, что могу cancel выполнить задачу, но вместо этого я хочу остановить / запустить ее позже. Я думал о том, чтобы сохранить ее в очереди и удалить очередь после завершения высокоприоритетной задачи. Можно ли это сделать с помощью быстрого параллелизма, или я надеюсь, что мне не придется оборачивать объект Operation с помощью async / await или чего-то подобного?

Ответ №1:

Из видео WWDC 2021 «Swift concurrency: за кулисами» задача планирует выполнение кода в будущем, но не дает вам большого контроля над тем, когда эта задача будет выполнена. В частности, даже если вы можете указать приоритет для задачи, бывают ситуации, когда у вас все еще может быть инверсия приоритета в порядке выполнения задач.

Ваш лучший выбор для того типа управления, который, по-видимому, вам нужен, — это использовать Grand Central Dispatch и иметь очереди с высоким и низким приоритетом, которые подаются в очередь последовательной отправки, а затем вы можете поместить свою задачу в соответствующую очередь.

РЕДАКТИРОВАТЬ: я только что увидел новую для меня конструкцию (прошло некоторое время с тех пор, как я ежедневно работал с GCD). Это называется Workloop (https://developer.apple.com/documentation/dispatch/workloop ) и похоже, что это может быть просто билет без ручной привязки очередей отправки вместе.