> Что такое detached task и чем он отличается от обычного task (iOS, Swift)
Уровень: junior · Роль: mobile · Категория: Технические вопросы
Компании: Aston
Стек: iOS, Swift
> Пример ответа
Короткий ответ
Detached task - это задача, созданная через Task.detached, которая не наследует контекст исполнения от родительской задачи: у неё нет родителя, своей priority и отдельный task-local storage. Обычный task (Task {}) наследует priority, actor isolation и task-local values от текущего контекста, а также автоматически отменяется при отмене родителя. Detached task живёт независимо и управляется только через свой handle.
Подробное объяснение
В Swift Concurrency задачи (Task) - это единицы асинхронной работы. Обычный Task {} создаётся внутри текущего контекста и наследует:
- приоритет (priority) - если не указан явно;
- actor isolation - если создаётся внутри actor, задача выполняется на этом actor;
- task-local values - значения, установленные через
TaskLocal; - структуру отмены - отмена родителя автоматически отменяет дочерние задачи.
Detached task (Task.detached) создаётся как полностью независимая задача:
- не имеет родителя - отмена родителя не влияет на неё;
- не наследует priority - по умолчанию получает
TaskPriority.medium, если не задан явно; - не наследует actor isolation - выполняется на глобальном executor, не на конкретном actor;
- не наследует task-local values - они пустые, если не установлены внутри самой задачи.
Основное назначение detached task - запустить работу, которая не должна зависеть от контекста вызова: например, фоновую загрузку, которая должна продолжиться даже после отмены текущего экрана, или задачу, которая должна выполняться вне actor.
Важно: detached task - это не "лучше" и не "хуже", а другой инструмент. В большинстве случаев обычный Task {} предпочтительнее, потому что он сохраняет иерархию и управляемость. Detached task оправдан, когда нужна явная изоляция от родительского контекста.
На практике
На iOS-проектах detached task используется редко. Чаще встречается обычный Task {} внутри View или ViewModel. Типичный сценарий для detached - запуск длительной фоновой операции, которая должна пережить жизненный цикл текущего экрана, например, отправка аналитики или загрузка большого файла.
Также detached task полезен, когда нужно выполнить код вне actor, чтобы не блокировать его. Например, если внутри @MainActor нужно запустить тяжёлую CPU-bound работу - detached task уйдёт на глобальный executor и не заблокирует main thread.
Но стоит помнить: если задача должна быть отменяемой вместе с родителем (например, при уходе с экрана), detached task - неправильный выбор. Нужно использовать обычный Task {} или TaskGroup.
Пример кода
SWIFT// Обычный task - наследует контекстfunc loadUser() async {let task = Task {// наследует priority и actor isolation от вызывающего контекстаawait fetchUser()}// отмена родителя отменит эту задачу}// Detached task - полностью независимfunc loadUserDetached() {let task = Task.detached(priority: .background) {// не наследует ничего от вызывающего контекстаawait fetchUser()}// отмена родителя НЕ отменит эту задачу}
Как отвечать на собеседовании
Начни с определения: detached task - это задача без родительского контекста. Затем перечисли ключевые отличия: наследование priority, actor isolation, task-local values и отмены. Подчеркни, что обычный task - это иерархическая задача, а detached - изолированная. Приведи пример, когда нужен detached (фоновая работа, не зависящая от экрана), и когда он вреден (задача должна отменяться вместе с родителем). Если спросят про TaskGroup - упомяни, что это отдельный механизм для параллельных подзадач, но не смешивай с detached.
Что проверяет интервьюер
Интервьюер проверяет:
- понимание модели задач в Swift Concurrency;
- знание наследования контекста (priority, actor isolation, task-local);
- понимание иерархии отмены;
- умение выбирать правильный инструмент под задачу;
- знание практических сценариев использования.
Это базовый вопрос уровня junior - ожидается уверенное объяснение без глубоких деталей про TaskLocal или Executor.
Типичные ошибки
- Говорить, что detached task "быстрее" или "лучше" - это не про производительность, а про изоляцию.
- Утверждать, что detached task нельзя отменить - отменить можно, просто отмена не привязана к родителю.
- Забывать, что detached task не наследует priority - по умолчанию medium.
- Путать detached task с
TaskGroup- это разные механизмы. - Не упоминать, что обычный task автоматически отменяется при отмене родителя - это ключевое отличие.
> Похожие задачи по mobile
Почему не выбрали MVP
Почему не использовали Clean Swift
Какие способы борьбы с data race существуют
Что происходит, если убрать реализацию протокола в наследнике в Swift?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью