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
Как ViewController'ы загружают свои View
🟡 lvl: mid-
ℹ️ Вьюконтроллер хранит свою вью как проперти. Только созданный VC не будет загружать вью по-умолчанию.
Если мы обращаемся к view, когда оно равно nil, то viewcontroller вызывает метод loadView(). Ленивая загрузка помогает создать вью только тогда, когда она необходима.
⚠️ Не стоит вызывать loadView самостоятельно, Если мы хотим принудительно загрузить нашу вьюху, то стоит вызвать loadViewIfNeeded().
Если же хотим проверить загрузил ли контроллер вьюху, не вызывая loadView для загрузки, то можно использовать isViewLoaded.
мы также можем обратиться к вью контролера через viewIfLoaded, или получим nil, если оно не загруженно
#lvl_mid
🟡 lvl: mid-
ℹ️ Вьюконтроллер хранит свою вью как проперти. Только созданный VC не будет загружать вью по-умолчанию.
Если мы обращаемся к view, когда оно равно nil, то viewcontroller вызывает метод loadView(). Ленивая загрузка помогает создать вью только тогда, когда она необходима.
⚠️ Не стоит вызывать loadView самостоятельно, Если мы хотим принудительно загрузить нашу вьюху, то стоит вызвать loadViewIfNeeded().
Если же хотим проверить загрузил ли контроллер вьюху, не вызывая loadView для загрузки, то можно использовать isViewLoaded.
мы также можем обратиться к вью контролера через viewIfLoaded, или получим nil, если оно не загруженно
#lvl_mid
🔥14❤1
блэт ватермарку пришлось ставить, потому что мой труд в фигме нагло крадется в ваши гиты, каналы и тп 🤡. А в наш культ нужны еще последователи. Если вы себе берете, то хотяб отмечайте
я че зря кнопки крашу в фигме что ли. Художника может любой обидеть
я че зря кнопки крашу в фигме что ли. Художника может любой обидеть
👍36❤🔥2❤1
Proxyman
короче, вы наверное уже знаете об этом замечательном сниффере, но я только пощупал его. До этого юзал Charles. Купил честным трудом лицензию 2 года назад. Не хотел уходить и предвзято смотрел на proxyman. Ведь за что я 7к руб отдавал? Чтоб сразу уходить с нее?
И пару дней назад, из-за долгих и лагующих моментов я все же установил proxyman. В разы удобнее. Быстрее. Лучше. Стильней.
Прощай, старушка Charles. Ты была дорога во всех смыслах
короче, вы наверное уже знаете об этом замечательном сниффере, но я только пощупал его. До этого юзал Charles. Купил честным трудом лицензию 2 года назад. Не хотел уходить и предвзято смотрел на proxyman. Ведь за что я 7к руб отдавал? Чтоб сразу уходить с нее?
И пару дней назад, из-за долгих и лагующих моментов я все же установил proxyman. В разы удобнее. Быстрее. Лучше. Стильней.
Прощай, старушка Charles. Ты была дорога во всех смыслах
👍12😢5🤔3🔥1💩1
The iOS Interview Guide
Полезность: 4,5 из 5
Думаю, лучше этой книги вы не найдете ни одну статью. Здесь множество различных вопросов, которые с 99% встретятся вам на практике
Не знаю, почему ее раньше игнорил, ведь каждое 2 из 3 интервью имеет формат этой книги.
Закрываем интернет. Лучше уже не будет
#books
Полезность: 4,5 из 5
Думаю, лучше этой книги вы не найдете ни одну статью. Здесь множество различных вопросов, которые с 99% встретятся вам на практике
Не знаю, почему ее раньше игнорил, ведь каждое 2 из 3 интервью имеет формат этой книги.
Закрываем интернет. Лучше уже не будет
#books
🔥21👍1