Ответ
Нет, не гарантирует. Серийная очередь (DispatchQueue) обеспечивает последовательное (serial) выполнение задач, но не привязывает их к одному конкретному потоку.
Ключевые моменты:
- Последовательность: В любой момент времени на очереди выполняется не более одной задачи. Следующая задача начнётся только после завершения предыдущей.
- Потоки: GCD управляет пулом потоков. Система может выполнять разные задачи одной серийной очереди на разных потоках из этого пула, особенно если поток был заблокирован или освободился.
Пример:
let serialQueue = DispatchQueue(label: "com.example.serial")
serialQueue.async {
print("Task 1 on thread: (Thread.current)")
}
serialQueue.async {
print("Task 2 on thread: (Thread.current)")
}
// Возможный вывод:
// Task 1 on thread: <NSThread: 0x...>{number = 4, name = (null)}
// Task 2 on thread: <NSThread: 0x...>{number = 7, name = (null)}
// Задачи выполнены последовательно, но на разных потоках.
Если требуется строгая привязка к одному потоку, нужно использовать Thread напрямую. Однако в большинстве сценариев GCD этого не требует — важна гарантия последовательности, а не конкретный поток.
Исключение: Главная очередь (DispatchQueue.main) всегда выполняется на главном потоке, так как она связана с Run Loop основного потока для обновления UI.