Discarding-группы: без результатов и без роста памяти 🥷🏻
🔥 withDiscardingTaskGroup и withThrowingDiscardingTaskGroup (SE-0381, Swift 5.9) выполняют задачи параллельно, не собирая результаты.
⚠️ Выигрыш обычно описывают слишком мягко — «нет буферизации результатов». На самом деле обычная группа удерживает целиком объект Task для каждого завершившегося ребёнка, пока вы его не вычерпаете через next() или итерацию. А TaskGroup не Sendable, так что слить её откуда-то ещё нельзя. В пропозале прямо: долгоживущая группа «утечёт тысячи объектов Task… и в итоге загонит процесс в исчерпание памяти». Раньше это лечили ручным ограничением concurrency. Discarding-группа освобождает каждого ребёнка сразу по завершении, поэтому память не растёт. Ещё две детали. Дочерние задачи обязаны возвращать Void — это не «результат молча выбрасывается»: группа просто не параметризована типом результата, и не-Void ребёнок будет ошибкой компиляции. И в бросающем варианте первая ошибка немедленно отменяет группу и всех соседей, а сама пробрасывается наружу; в обычной бросающей группе ошибки всплывают только когда вы вызовете next() или waitForAll(), а не вызовете — проглотятся молча.
💡 Итерации нет вообще: ни next(), ни конформанса AsyncSequence. Все дети дожидаются автоматически на выходе из скоупа.
#Swift #SwiftConcurrency #TaskGroup #AsyncAwait #iOSDevelopment