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
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 оптимизировал выполнение
3. Проверить отмену таски можно через
4. ❌ Выполнение async-await не thread-safe!
5. Unstructered task -
6. Detached task - в каком-то смысле аналог запуска очереди с qos:
#readthis
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
Apple Developer
Explore structured concurrency in Swift - WWDC21 - Videos - Apple Developer
When you have code that needs to run at the same time as other code, it's important to choose the right tool for the job. We'll take you...