Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про IOS: concurrency, result, ordering

Как сохранить порядок результатов при параллельном выполнении задач?

Вопрос проверяет умение работать с параллельными задачами и корректно собирать результаты без потери порядка.

Короткий ответ

При параллельном выполнении задачи завершаются в произвольном порядке. Чтобы сохранить порядок, нужно явно его зафиксировать: использовать индекс, ассоциировать результат с ключом или заранее подготовить контейнер. В GCD это делается через массив с индексами и синхронизацию. В Swift Concurrency порядок сохраняется через async let или ручную сортировку результатов. Без дополнительной логики порядок не гарантируется.

Длинный ответ

Параллелизм почти всегда ломает естественный порядок выполнения, поэтому его нужно восстанавливать вручную.

Почему порядок теряется

Асинхронные задачи:

  • стартуют почти одновременно

  • выполняются с разной скоростью

  • зависят от сети, IO, планировщика потоков

Поэтому первая запущенная задача не обязана завершиться первой.

Подход 1: Привязка результата к индексу (GCD)

Самый надежный и наглядный способ.

  1. Заранее создается массив нужного размера

  2. Каждая задача знает свой индекс

  3. Результат записывается строго по этому индексу

  4. Запись синхронизируется

Пример идеи (упрощенно):

var results = Array<Data?>(repeating: nil, count: urls.count)
let queue = DispatchQueue(label: "results.queue")

for (index, url) in urls.enumerated() {
    load(url) { data in
        queue.async {
            results[index] = data
        }
    }
}

После завершения всех задач массив уже упорядочен.

Подход 2: Использование DispatchGroup + индекс

DispatchGroup отвечает за “когда все завершилось”, а индекс — за порядок.

  • group.enter() перед стартом

  • group.leave() в completion

  • порядок контролируется структурой хранения

Это самый частый паттерн в коде на GCD.

Подход 3: Swift Concurrency (async let)

Если количество задач фиксированное:

async let first = fetchA()
async let second = fetchB()

let results = await [first, second]

Здесь порядок определяется местом в массиве, а не временем выполнения.

Подход 4: TaskGroup с индексами

Если задач много и они динамические:

  • каждая задача возвращает (index, value)

  • результаты собираются в массив

  • в конце массив упорядочен по индексам

Частые ошибки

  • добавление результатов через append

  • отсутствие синхронизации при записи

  • ожидание, что порядок “сам сохранится”

Вывод

Параллельное выполнение почти всегда разрушает порядок. Если порядок важен, его нужно сохранять явно: через индексы, ключи или структуру результата. Хорошая новость в том, что это решаемо стандартными паттернами — главное не полагаться на случайность.

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • IOS

    IOS

Ключевые слова

#concurrency

#result

#ordering

Подпишись на iOS Developer в телеграм

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.