SwiftUI dev
1.17K subscribers
87 photos
37 videos
1 file
74 links
Mobile development, SwiftUI, Compose, feel free to reach me: @lexkraev
Download Telegram
Meet async/await in Swift
https://developer.apple.com/videos/play/wwdc2021/10132/
❗️Главное:
1. Async/await существенно сокращает код, позволяет не думать о всех случаях в замыканиях
2. ⚙️ Принцип работы строится на следующем: если синхронная процедура возвращает контроль потоку только в случае завершения, то асинхронная - откладывает свое выполнение. Когда мы вызываем async функцию, то передаем контроль над потоком в эту функцию, после запуска await-функция может быть приостановлена. Как только это произошло, процедура теряет контроль над потоком. Но вместо того, чтобы возвращать управление вашей async-функции, она вместо этого передает управление потоком системе. В этом случаем, аsync-функция также приостанавливает работу. Тогда система сама решает, какая более важная работа должна произойти. В какой-то момент, система продолжит выполнение функции. Этот процесс может повторяться столько, сколько нужно
3. ☝🏼Поддерживаются также Async properties, но такие свойства только read-only, и Async sequences
4. 🌉Мост для связывания синхронного (например, выполнение async в модификаторе onAppear{..} и асинхронного async кода - Task. Task упаковывает async код и посылает системе для немедленного выполнения в доступном потоке, процесс похож на DispatchQueue.global().async
5. Рекомендации по нэймингу: убирать из методов поддерживающих async-await префикс get: так как результат работы не возвращается напрямую
6. Для оберток методов в async-await использовать CheckedContinuation<> и вызывать метод внутри withCheckedContinuation{…} или withCheckedThrowingContinuation{…}
7. 🚨resume() внутри withCheckedContinuation/withCheckedThrowingContinuation можно вызывать только один раз в своей ветке

#readthis
Explore structured concurrency in Swift
https://developer.apple.com/videos/play/wwdc2021/10134
❗️Главное:
1. Виды task в swift: async let, group, unstructered (Task), detached (Task.detached)
2. Swift оптимизировал выполнение async-await, например, если в guard два условия и оба вычисляются через await, то в случае, если одно из условий не выполняется, то второе вычисляться не будет.
3. Проверить отмену таски можно через Task.isCancelled
4. Выполнение async-await не thread-safe!
5. Unstructered task - Task {} - в каком-то смысле аналог DispatchQueue.global().async {}
6. Detached task - в каком-то смысле аналог запуска очереди с qos: DispatchQueue.global(qos: .background).async{} - пример использования: сохранение кэша или в coredata

#readthis