На мой взгляд, одна из лучших книг про #Combine , все достаточно подробно описано, дополнено примерами
#readthis
#readthis
heckj.github.io
Using Combine
SwiftUI dev pinned «На мой взгляд, одна из лучших книг про #Combine , все достаточно подробно описано, дополнено примерами #readthis»
Отличная лайвкодинг-сессия с подходом UDA на примере #Redax в SwiftUI
LiveCoding: SwiftUI with unidirectional architecture
#watchthis
LiveCoding: SwiftUI with unidirectional architecture
#watchthis
YouTube
LiveCoding: SwiftUI with unidirectional architecture / Алексей Демедецкий
Купить билеты на iOS Ukraine #2, которая пройдет 17 Мая 2021 можно по ссылке:
https://2event.com/events/1863065#/
Подписывайтесь на наши соц сети:
Twitter: https://twitter.com/iOSUkraine
Telegram Channel: https://t.me/iOSUkraine
Telegram Chat: https://t…
https://2event.com/events/1863065#/
Подписывайтесь на наши соц сети:
Twitter: https://twitter.com/iOSUkraine
Telegram Channel: https://t.me/iOSUkraine
Telegram Chat: https://t…
SwiftUI dev
📖 Весьма подробная презентация “Demystify SwiftUI” #watchthis
❗️Главное:
1. ❌ Не использовать AnyView, строится неоптимальный код
2. 📖 В SwiftUI два типа identity у View: structural и explicit, в UIKit - pointer identiity
3. 👆🏻 If-else - относится к structural типу. If-else разворачивается «под капотом» в
4. ☝🏼 Стараться по возможности минимизировать ветвление If-else, например, заменяя легкими модификаторами. Это, как минимум, улучшает отрисовку анимации. Если не получается, то стараться «бранчевать» ниже всего в иерархии view: так как sui оптимизирован из коробки, будут перерисоваться только те view, у которых сменился identity.
5. ☝🏼 В
6. 🤷🏼♂️ Использование UUID спасает во многих ситуациях, но считается не лучшей практикой: неожидаемая отрисовка анимации в списке, когда новый элемент надо поместить в начало списка
#readthis
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
https://developer.apple.com/videos/play/wwdc2021/10132/
❗️Главное:
1.
2. ⚙️ Принцип работы строится на следующем: если синхронная процедура возвращает контроль потоку только в случае завершения, то асинхронная - откладывает свое выполнение. Когда мы вызываем async функцию, то передаем контроль над потоком в эту функцию, после запуска await-функция может быть приостановлена. Как только это произошло, процедура теряет контроль над потоком. Но вместо того, чтобы возвращать управление вашей async-функции, она вместо этого передает управление потоком системе. В этом случаем, аsync-функция также приостанавливает работу. Тогда система сама решает, какая более важная работа должна произойти. В какой-то момент, система продолжит выполнение функции. Этот процесс может повторяться столько, сколько нужно
3. ☝🏼Поддерживаются также Async properties, но такие свойства только read-only, и Async sequences
4. 🌉Мост для связывания синхронного (например, выполнение async в модификаторе
5. Рекомендации по нэймингу: убирать из методов поддерживающих async-await префикс get: так как результат работы не возвращается напрямую
6. Для оберток методов в
7. 🚨resume() внутри
#readthis
async/await
in Swifthttps://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