AsyncStream: коллбэки превращаются в for await 🎏

🌉 Оборачиваем делегат, нотификацию или таймер один раз — дальше потребляем как обычную последовательность, а уборку вешаем на onTermination.

С Swift 5.9 (SE-0388) есть AsyncStream.makeStream — больше не нужно вытаскивать continuation из замыкания инициализатора через implicitly unwrapped optional. Старый способ рабочий и безопасный, просто менее удобный.

⚠️ И главное, что стоит поправить в половине статей на эту тему: AsyncStream не даёт backpressure. yield возвращается сразу и ничего не тормозит — он буферизует и дропает по политике. Дефолт, кстати, .unbounded, так что на горячем потоке память растёт молча. SE-0406 как раз пытался добавить настоящий backpressure и был returned for revision — за ним идти в swift-async-algorithms. Ещё AsyncStream — unicast: два цикла for await поделят элементы между собой, а не получат каждый свой.

#Swift #SwiftLang #iOS #SwiftConcurrency #AsyncAwait

AsyncStream: коллбэки превращаются в for await 🎏 | Сетка — социальная сеть от hh.ru