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
SwiftUI dev pinned «На мой взгляд, одна из лучших книг про #Combine , все достаточно подробно описано, дополнено примерами #readthis»
📖 Sources of truth in SwiftUI
Подробно про StateObject
SwiftUI dev
📖 Весьма подробная презентация “Demystify SwiftUI” #watchthis
❗️Главное:
1. Не использовать AnyView, строится неоптимальный код
2. 📖 В SwiftUI два типа identity у View: structural и explicit, в UIKit - pointer identiity
3. 👆🏻 If-else - относится к structural типу. If-else разворачивается «под капотом» в _ConditionalContent с новым Branch.
4. ☝🏼 Стараться по возможности минимизировать ветвление If-else, например, заменяя легкими модификаторами. Это, как минимум, улучшает отрисовку анимации. Если не получается, то стараться «бранчевать» ниже всего в иерархии view: так как sui оптимизирован из коробки, будут перерисоваться только те view, у которых сменился identity.
5. ☝🏼 В ForEach рекомендуется использовать strong explicit identity (например, явный id объекта, взятый из БД)
6. 🤷🏼‍♂️ Использование UUID спасает во многих ситуациях, но считается не лучшей практикой: неожидаемая отрисовка анимации в списке, когда новый элемент надо поместить в начало списка

#readthis
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