Async/Await
🟢 lvl: jun
Концепция async/await не придумана эйпл. От ассинхронного кода никуда не деться. Мы не можем блокировать главный поток, пока будет ожидать ответа от сервера или других внешних устройств.
С этим драконом борятся давно и в других языках. Эйпл в очередной раз что-то позаимствовала у других. И это что-то очень хорошо работает и облегчает жить.
Её задача упростить работу с асинхронным кодом и уйти от уродской модели колбэков
В XCode есть даже функционал, который помогает нам безболезненно все изменить
Заботливо 👨👨👦
#lvl_jun
🟢 lvl: jun
Концепция async/await не придумана эйпл. От ассинхронного кода никуда не деться. Мы не можем блокировать главный поток, пока будет ожидать ответа от сервера или других внешних устройств.
С этим драконом борятся давно и в других языках. Эйпл в очередной раз что-то позаимствовала у других. И это что-то очень хорошо работает и облегчает жить.
Её задача упростить работу с асинхронным кодом и уйти от уродской модели колбэков
В XCode есть даже функционал, который помогает нам безболезненно все изменить
Заботливо 👨👨👦
#lvl_jun
❤🔥13👍4🔥2
Тесты — это отдельная тема для споров.
В авито прям почти полный отказ от ручного тестирования , где QA специалист занимается в последнюю очередь ручными прогонами. Мб как-нибудь лучше об этом расскажу в марафоне про тестирования. Пока же можете почитать у моего тимлида тут
Считаю мощнейшим инструментом, который:
- Экономит время и деньги на ручное тестирование
- Дополнительно документирует код
- Ускоряют time-to-market
- Вся команда лучше заботится о качества
Вот еще крутейшая статья от @akaDuality
А еще мы ищем хорошего автотестера в нашу команду 💖 Если у вас есть такой, то пишите
В авито прям почти полный отказ от ручного тестирования , где QA специалист занимается в последнюю очередь ручными прогонами. Мб как-нибудь лучше об этом расскажу в марафоне про тестирования. Пока же можете почитать у моего тимлида тут
Считаю мощнейшим инструментом, который:
- Экономит время и деньги на ручное тестирование
- Дополнительно документирует код
- Ускоряют time-to-market
- Вся команда лучше заботится о качества
Вот еще крутейшая статья от @akaDuality
А еще мы ищем хорошего автотестера в нашу команду 💖 Если у вас есть такой, то пишите
❤🔥6🔥2
Actors
🟢 lvl: jun
Акторная модель еще в древней Греции помогала решать проблемы гонки.
Actor’ы — это ссылочные типы, что вкратце означает, что копии ссылаются на один и тот же фрагмент данных. Тем не менее у акторов есть важное отличие от классов: они не поддерживают наследование.
Actor’ы предотвращают гонки данных, создавая синхронизированный доступ к своим изолированным данным
1️⃣ На первом скрине мы бы реализовали свой потокобезопасный класс через барьеры.
2️⃣ На втором так, если бы воспользовались actor’ами
https://www.avanderlee.com/swift/actors/
#lvl_jun
🟢 lvl: jun
Акторная модель еще в древней Греции помогала решать проблемы гонки.
Actor’ы — это ссылочные типы, что вкратце означает, что копии ссылаются на один и тот же фрагмент данных. Тем не менее у акторов есть важное отличие от классов: они не поддерживают наследование.
Actor’ы предотвращают гонки данных, создавая синхронизированный доступ к своим изолированным данным
1️⃣ На первом скрине мы бы реализовали свой потокобезопасный класс через барьеры.
2️⃣ На втором так, если бы воспользовались actor’ами
https://www.avanderlee.com/swift/actors/
#lvl_jun
🐳9👍5
MainActor
🟢 lvl: jun
MainActor — это глобальный актор, который использует main очередь для выполнения своей работы. Раньше нам приходилось DispatchQueue.main.async (1), чтобы обновлять ui. MainActor помогает с помощью компилятора делать это за нас автоматически.
Если же нужно выполнить код на главном акторе, то можно выполнить `MainActor.run` (2)
#lvl_jun
🟢 lvl: jun
MainActor — это глобальный актор, который использует main очередь для выполнения своей работы. Раньше нам приходилось DispatchQueue.main.async (1), чтобы обновлять ui. MainActor помогает с помощью компилятора делать это за нас автоматически.
Если же нужно выполнить код на главном акторе, то можно выполнить `MainActor.run` (2)
#lvl_jun
🐳5👍3🌭1
SwagGen
🟡lvl: mid-
Я большой сторонник адекватной автоматизации. Если есть силы сократить деньги и время на рутинных задачах — только вперед.
Кажется, что создание апи-моделей и описание нетворк слоя одно из самых рутинных и монотоных занятий. Скучнее только локализация на 18 языков ручным вводом из гугл-переводчика
Если ваша апи-документация в сваггере, то отличный повод затащить в проект генератор моделей и запросов. Юзал это на боевых проектах и видел в продуктах магнита
#lvl_mid
🟡lvl: mid-
Я большой сторонник адекватной автоматизации. Если есть силы сократить деньги и время на рутинных задачах — только вперед.
Кажется, что создание апи-моделей и описание нетворк слоя одно из самых рутинных и монотоных занятий. Скучнее только локализация на 18 языков ручным вводом из гугл-переводчика
Если ваша апи-документация в сваггере, то отличный повод затащить в проект генератор моделей и запросов. Юзал это на боевых проектах и видел в продуктах магнита
#lvl_mid
GitHub
GitHub - yonaskolb/SwagGen: OpenAPI/Swagger 3.0 Parser and Swift code generator
OpenAPI/Swagger 3.0 Parser and Swift code generator - yonaskolb/SwagGen
👍7🐳3
Локализации
Поговорим еще о теме автоматизации и о чехах.
Если приложение небольшое, то хватит пару Localizable.strings и ручками можно сидеть переводить в гугл переводчике. Есть история, когда будучи еще джуном и вебером нас заставили сидеть переводить текста в гуглпереводчике на четыре языка. Это было в одном риелторском агенстве
С русского -> на английский -> казахский -> чешский. Настоящее инженерское решение, не так ли?
Мы кстати неплохо так заработали по той сдельной системе, где были не разработчиками, а копипастерами. (отдельная тема вреда таких мотиваций)
Что получилось сложно представить, но легко предположить, как реагировали чехи. Они, мягко говоря, изумленно удивлялись новым придуманным словам, которые никогда раньше не слышали. Через какое-то время чехи перестали быть нашими партнерами
Какой же сценарий сделать норм локализацию? Для больших продуктов тема непростая. Особенно, когда у вас:
— 10-15 языков, которые ручками вы устанете вбивать
— Локали и валюты
— Системы счисления (мб даже другие измерения)
— Лайаут для текста (араб, иероглифы)
Мне кажется, идеальный вариант локализации — это только ключи, с которыми работает программист. например profile_catalog_price. Программист не должен переводить (упаси господь). Переводы должны генерироваться при билде из админки или в крайнем случае из эксель файла. Иначе любой чех перестанет быть вашим другом, locale_name_curva
Ну а здесь подробное руководство.
https://medium.com/codex/localization-workflow-in-ios-9f96b7f4388c
Но а с лайаутами, локалями и валютами надо поресерчить)
Поговорим еще о теме автоматизации и о чехах.
Если приложение небольшое, то хватит пару Localizable.strings и ручками можно сидеть переводить в гугл переводчике. Есть история, когда будучи еще джуном и вебером нас заставили сидеть переводить текста в гуглпереводчике на четыре языка. Это было в одном риелторском агенстве
С русского -> на английский -> казахский -> чешский. Настоящее инженерское решение, не так ли?
Мы кстати неплохо так заработали по той сдельной системе, где были не разработчиками, а копипастерами. (отдельная тема вреда таких мотиваций)
Что получилось сложно представить, но легко предположить, как реагировали чехи. Они, мягко говоря, изумленно удивлялись новым придуманным словам, которые никогда раньше не слышали. Через какое-то время чехи перестали быть нашими партнерами
Какой же сценарий сделать норм локализацию? Для больших продуктов тема непростая. Особенно, когда у вас:
— 10-15 языков, которые ручками вы устанете вбивать
— Локали и валюты
— Системы счисления (мб даже другие измерения)
— Лайаут для текста (араб, иероглифы)
Мне кажется, идеальный вариант локализации — это только ключи, с которыми работает программист. например profile_catalog_price. Программист не должен переводить (упаси господь). Переводы должны генерироваться при билде из админки или в крайнем случае из эксель файла. Иначе любой чех перестанет быть вашим другом, locale_name_curva
Ну а здесь подробное руководство.
https://medium.com/codex/localization-workflow-in-ios-9f96b7f4388c
Но а с лайаутами, локалями и валютами надо поресерчить)
Medium
Localization workflow in iOS
Using SwiftGen and [Phrase]
😁11👍2
Увидел такую статью тут. Где спрашивают такое у сеньоров? Если на западе задают такие простые вопросы, то пора учить английский
https://tanaschita.com/20190715-ios-interview-questions-and-answers-swift
https://tanaschita.com/20190715-ios-interview-questions-and-answers-swift
Telegram
iOS Dev
iOS-интервью: вопросы и ответы для Senior-разработчика на техническом собеседовании
Непростая задача — оценить навыки и знания другого разработчика. В серии постов автор делится своей подборкой вопросов и ответов по iOS и Swift.
Вопросы сгруппированы по…
Непростая задача — оценить навыки и знания другого разработчика. В серии постов автор делится своей подборкой вопросов и ответов по iOS и Swift.
Вопросы сгруппированы по…
🐳5👍2
How Actors Work Internally in Swift
🟡 lvl: mid
Если кому интересно как работают акторы под капотом в свифт, то стоит почитать:
— Что такое глобальные акторы?
— Как создать свой актор?
— Что такое executors?
https://swiftrocks.com/how-actors-work-internally-in-swift
#lvl_mid
🟡 lvl: mid
Если кому интересно как работают акторы под капотом в свифт, то стоит почитать:
— Что такое глобальные акторы?
— Как создать свой актор?
— Что такое executors?
https://swiftrocks.com/how-actors-work-internally-in-swift
#lvl_mid
Swiftrocks
How Actors Work Internally in Swift
Lets explore how actors work under the hood, using Swift's own source code as a guide to finding out how they work inside the compiler.
❤🔥4🐳4👍3
Так.
За эти 2 недели уже 5й человек из канала спросил меня по теме менторства. Поэтому я напомню, что да — я менторю людей. У меня даже в описании канала есть ссылка 😄
Чаще помогаю с:
— подготовкой к собеседованиям. Там выявляем точки роста и намечаем план развития.
— тестовым проектам к резюме. Предлагаю и веду проект с кодревью, чтобы оценивать его презентабельность и рыночную ценность.
— помогаю с текущими проектами на работе. Разбираем архитектуру проектов и помогаю с текущими задачами
— Провожу лекции для джунов и мидлов по техническим темам, чтоб подтянуть пробелы
Вы можете посмотреть отзывы и заказать услугу на солвери.
Или написать напрямую в телегу, тут скидка (без коммисий к сервису).
Вообще мотивация простая. Прокачаться самому как ментор, найти крутых коллег, кому-то даже предложить реферальные ссылки. У меня в сумме уже из всех платформ около 300 часов преподавания. Уже около 10м людям с помощью канала и менторства нашли работу. Кому-то даже с зп под 400к и его искали на позицию целый год
так что не стесняйтесь писать.
За эти 2 недели уже 5й человек из канала спросил меня по теме менторства. Поэтому я напомню, что да — я менторю людей. У меня даже в описании канала есть ссылка 😄
Чаще помогаю с:
— подготовкой к собеседованиям. Там выявляем точки роста и намечаем план развития.
— тестовым проектам к резюме. Предлагаю и веду проект с кодревью, чтобы оценивать его презентабельность и рыночную ценность.
— помогаю с текущими проектами на работе. Разбираем архитектуру проектов и помогаю с текущими задачами
— Провожу лекции для джунов и мидлов по техническим темам, чтоб подтянуть пробелы
Вы можете посмотреть отзывы и заказать услугу на солвери.
Или написать напрямую в телегу, тут скидка (без коммисий к сервису).
Вообще мотивация простая. Прокачаться самому как ментор, найти крутых коллег, кому-то даже предложить реферальные ссылки. У меня в сумме уже из всех платформ около 300 часов преподавания. Уже около 10м людям с помощью канала и менторства нашли работу. Кому-то даже с зп под 400к и его искали на позицию целый год
так что не стесняйтесь писать.
Solvery.io
Лев Бондаренко — наставник на Solvery.io
Помогу прокачать навыки: Мобильная разработка, Git, Clean Architecture, MVP, REST API, Тестирование, Подготовка технических докладов, TDD, Unit Tests, iOS, Swift, Xcode, Viper, MVVM
❤🔥15👍7🔥3
Подборки статей про оптимизацию
1. UILable может жрать больше, чем вы думаете. Аккуратно работать с DispatchSemaphore(value: 0) и почему для UIVIew не стоит юзать tag
2. Почему изображение длиной 2048 и шириной 1536 с размером изображения 590 КБ использует 10 мб памяти
3. Уже бывалые тут советы от swift-гита
4. Rendering performance и стандартные оптимизации 60 фпс
5. Статья из античных времен про производительность UIKit
1. UILable может жрать больше, чем вы думаете. Аккуратно работать с DispatchSemaphore(value: 0) и почему для UIVIew не стоит юзать tag
2. Почему изображение длиной 2048 и шириной 1536 с размером изображения 590 КБ использует 10 мб памяти
3. Уже бывалые тут советы от swift-гита
4. Rendering performance и стандартные оптимизации 60 фпс
5. Статья из античных времен про производительность UIKit
🔥9❤🔥5
Frame vs Bounds
🟢 lvl: jun
Одна из баз базовых на сессиях по UIKit, но почему-то многие часто валятся
🖼 Frame — расположение и размер view с использованием системы координат родительского представления (важно для размещения представления в superview).
Чаще говоря про фрейм вспоминают стену и рамку картину. Стена — это супервьюха, а рамка — это вью
🟩 Bounds — местоположение и размер представления с использованием его собственной системы координат (важно для размещения содержимого View или subview внутри него)
❓Когда использовать frame и когда использовать bounds.
Поскольку frame связывает местоположение view в superview, используйте его при внесении внешних изменений: ширины или вычисления расстояния между view и вериной его родительского view.
Используйте bounds для внутренних изменений: рисования или организации subview в пределах view. Также используйте bounds для получения размера view, если вы сделали какие-то преобразование для него.
Частый вопрос "А когда у нас может поменяться bounds?". Ответ — в ScrollView. На изменении своих координат строится вся модель скроллинга
#lvl_jun
🟢 lvl: jun
Одна из баз базовых на сессиях по UIKit, но почему-то многие часто валятся
🖼 Frame — расположение и размер view с использованием системы координат родительского представления (важно для размещения представления в superview).
Чаще говоря про фрейм вспоминают стену и рамку картину. Стена — это супервьюха, а рамка — это вью
🟩 Bounds — местоположение и размер представления с использованием его собственной системы координат (важно для размещения содержимого View или subview внутри него)
❓Когда использовать frame и когда использовать bounds.
Поскольку frame связывает местоположение view в superview, используйте его при внесении внешних изменений: ширины или вычисления расстояния между view и вериной его родительского view.
Используйте bounds для внутренних изменений: рисования или организации subview в пределах view. Также используйте bounds для получения размера view, если вы сделали какие-то преобразование для него.
Частый вопрос "А когда у нас может поменяться bounds?". Ответ — в ScrollView. На изменении своих координат строится вся модель скроллинга
#lvl_jun
👍18🐳3
UIView vs CALayer
🟢 lvl: jun
🟣 У каждого view есть свой layer. Каждый лейер нужен для отрисовки внутри вью. Вью — это делегат слоя.
🟣 Когда мы устанавливаем backgroundColor вьюхи, то по сути мы устанавливаем backgroundColor для слоя. Или если мы устанавливаем backgroundColor для слоя напрямую, то backgroundColor для вью устанавливается аналогично
🟪 У слоев есть подслои. Или же дерево слоев аналогично с деревом вьюх
#lvl_jun
🟢 lvl: jun
🟣 У каждого view есть свой layer. Каждый лейер нужен для отрисовки внутри вью. Вью — это делегат слоя.
🟣 Когда мы устанавливаем backgroundColor вьюхи, то по сути мы устанавливаем backgroundColor для слоя. Или если мы устанавливаем backgroundColor для слоя напрямую, то backgroundColor для вью устанавливается аналогично
🟪 У слоев есть подслои. Или же дерево слоев аналогично с деревом вьюх
#lvl_jun
👍18
Figma Export
Еще одна полезная тулза для автоматизации рутиных обновлений.
Полезно, когда ходите всегда держать актуальные цвета, фонты и иконки, если ваши дизайнеры любят менять фигму и не уведомлять об изменениях
Все генерится прям в код. Ну и при желании можно конечно подредачить
Единственное условие — нужна платная подписка на фигму
Подробнее в этой статье
Еще одна полезная тулза для автоматизации рутиных обновлений.
Полезно, когда ходите всегда держать актуальные цвета, фонты и иконки, если ваши дизайнеры любят менять фигму и не уведомлять об изменениях
Все генерится прям в код. Ну и при желании можно конечно подредачить
Единственное условие — нужна платная подписка на фигму
Подробнее в этой статье
👍8❤🔥3🔥2
Frame vs Bounds: Как работает UIScrollView?
🟢 lvl: jun
Что будет с сабвьюхами, если мы изменим frame или bounds у их супервью?
1. Изменяя frame также меняются его сабвьюхи.
2. Изменяя bounds у супервью наша позиция остается неизменной, но сабвьюхи внутри будто смещаются.
Это происходит потому, что супервью имеет свой фрейм относительно своего супервью. И фактически меняя bounds мы меняем начало координат по отношению к его собственным.
Этот эффект похож на эффект пленки и фиксированной камеры.
📸 Камера — это вью. Она неподвижна и стоит на месте.
🎞 Пленка — это контент внутри, который позиционируется относительно системы координат.
подробнее в этой статье:
https://oleb.net/blog/2014/04/understanding-uiscrollview/
🟢 lvl: jun
Что будет с сабвьюхами, если мы изменим frame или bounds у их супервью?
1. Изменяя frame также меняются его сабвьюхи.
2. Изменяя bounds у супервью наша позиция остается неизменной, но сабвьюхи внутри будто смещаются.
Это происходит потому, что супервью имеет свой фрейм относительно своего супервью. И фактически меняя bounds мы меняем начало координат по отношению к его собственным.
Этот эффект похож на эффект пленки и фиксированной камеры.
📸 Камера — это вью. Она неподвижна и стоит на месте.
🎞 Пленка — это контент внутри, который позиционируется относительно системы координат.
подробнее в этой статье:
https://oleb.net/blog/2014/04/understanding-uiscrollview/
❤🔥13❤1
Отойдем немного от программирования и погрузимся немного в аджайл и скрам
Кто меня хорошо знает, тот наверное слышал, как я люблю заливать про гибкие методики разработки. И может через лет 10 я уйду из разработки и стану аджайл-коучем и скрам мастером 🤡
Но а если серьезно, то тема планирования одна из сложнейших. Часто какие-то инфоцыгани зальют о том, что главное это помодоро, джедайские техники и какой-то приоритезатор задач SMART
Я глубо с этим не согласен. Это хорошо работает как пилюля против прокрастинации. Но мы с вами разрабы. Где помимо своей вовлеченности и нефокусировки есть хаос.
Хаос — это враг. Мы с ним деремся в коде. Мы с ним сражаемся в джире. Мы ноем о нем на ретро и дейли.
Чужое легаси. Непонятное тз. Вагон зависимостей. Телега факторов, которые страшнее твоей мотивации.
В этой статье есть крутые вводные и инструменты. На мой взгляд борьба с неопределенностью это не геройство и не дисциплина. Это целая наука и искусство
https://habr.com/ru/post/536570/
Кто меня хорошо знает, тот наверное слышал, как я люблю заливать про гибкие методики разработки. И может через лет 10 я уйду из разработки и стану аджайл-коучем и скрам мастером 🤡
Но а если серьезно, то тема планирования одна из сложнейших. Часто какие-то инфоцыгани зальют о том, что главное это помодоро, джедайские техники и какой-то приоритезатор задач SMART
Я глубо с этим не согласен. Это хорошо работает как пилюля против прокрастинации. Но мы с вами разрабы. Где помимо своей вовлеченности и нефокусировки есть хаос.
Хаос — это враг. Мы с ним деремся в коде. Мы с ним сражаемся в джире. Мы ноем о нем на ретро и дейли.
Чужое легаси. Непонятное тз. Вагон зависимостей. Телега факторов, которые страшнее твоей мотивации.
В этой статье есть крутые вводные и инструменты. На мой взгляд борьба с неопределенностью это не геройство и не дисциплина. Это целая наука и искусство
https://habr.com/ru/post/536570/
Хабр
Кристиан Вервейс: О сложности или зачем вам Скрам?
Кристиан Вервейс: О сложности или зачем вам Скрам? Предисловие переводчика Предупреждение: Это лонгрид и это достаточно серьезный текст, далекий от большинства “простеньких” объяснений,...
👍9🔥2👎1
"Дизайн-мышление в бизнесе" Тим Браун
Вода: 30%
Полезность: 8 из 10
Убежден, что хороший специалист всегда должен понимать свою аудиторию.
Все начинается с эмпатии и аналитики. Проектная и аутсорс разработка когда-то сильно меня зафреймила и дала глупую установку, что заказчик всегда прав. "Кто платит тот и девушку танцует".
Но не все так однозначно. Не стоит ограничиваться только контрактом на разработку приложения. Есть рынок, который окупает все инвестиции. И его важнее понимать и чувствовать, чтоб не утонуть в мертвых гипотезах, которые стреляют в пустоту.
Дизайн мышление — это один из инструментов клиентоцентричности. Им пропитан весь менеджмент сбера. В книге есть множество советов и философий
Однозначно топ.
#book
Вода: 30%
Полезность: 8 из 10
Убежден, что хороший специалист всегда должен понимать свою аудиторию.
Все начинается с эмпатии и аналитики. Проектная и аутсорс разработка когда-то сильно меня зафреймила и дала глупую установку, что заказчик всегда прав. "Кто платит тот и девушку танцует".
Но не все так однозначно. Не стоит ограничиваться только контрактом на разработку приложения. Есть рынок, который окупает все инвестиции. И его важнее понимать и чувствовать, чтоб не утонуть в мертвых гипотезах, которые стреляют в пустоту.
Дизайн мышление — это один из инструментов клиентоцентричности. Им пропитан весь менеджмент сбера. В книге есть множество советов и философий
Однозначно топ.
#book
👍6🔥2
Обновление лайаута: SetNeedLayout vs LayoutIfNeeded
🟢 lvl: jun
Есть множества событий, которые влияют на интерфейс: нажатие на кнопку, местоположения, нетворк запросы. Только пока эти события обрабатываются наш интерфейс не обновляется автоматически
layoutSubviews — это главный метод, в котором пересчитываются фреймы у вью и его сабвью. При желании перерисовать вью нужно вызвать этот метод. Его прямой вызов слишком ресурсозатратный.
⛔ НО НИКОГДА НЕ ДЕЛАТЬ ЭТО НАПРЯМУЮ ⛔
Вместо прямого вызова у нас есть 2 метода.
1️⃣ setNeedsLayout — сообщаем нашей системе перерисовать вью ассинхронно в следующем цикле отрисовки.
2️⃣ layoutIfNeeded — напротив же сообщает системе, что нужно отрисовать вью и его сабвьюх немедленно, не дожидаясь следующего цикла отрисовки.
🟢 lvl: jun
Есть множества событий, которые влияют на интерфейс: нажатие на кнопку, местоположения, нетворк запросы. Только пока эти события обрабатываются наш интерфейс не обновляется автоматически
layoutSubviews — это главный метод, в котором пересчитываются фреймы у вью и его сабвью. При желании перерисовать вью нужно вызвать этот метод. Его прямой вызов слишком ресурсозатратный.
⛔ НО НИКОГДА НЕ ДЕЛАТЬ ЭТО НАПРЯМУЮ ⛔
Вместо прямого вызова у нас есть 2 метода.
1️⃣ setNeedsLayout — сообщаем нашей системе перерисовать вью ассинхронно в следующем цикле отрисовки.
2️⃣ layoutIfNeeded — напротив же сообщает системе, что нужно отрисовать вью и его сабвьюх немедленно, не дожидаясь следующего цикла отрисовки.
🔥13🐳4