#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 ) и похоже, что это может быть просто билет без ручной привязки очередей отправки вместе.