Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck
9.86K subscribers
1.44K photos
66 videos
52 files
4.19K links
Все самое полезное для мобильного разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/b60af5a4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a4adec1b17b35b6c0d8389
Download Telegram
👨‍💻 How to: оптимизировать производительность iOS-приложения

Вот 10 практических хаков для повышения производительности iOS-приложения, проверенных на производственных проектах.

1️⃣ Безжалостно профилируйте с помощью инструментов.

Инструменты: в Xcode есть Time Profiler, Allocations и Energy Log (Xcode -> Open Developer Tool -> Instruments).

Что делать: выявляйте узкие места, анализируя использование процессора, памяти и энергии. Например, используйте Time Profiler, чтобы выявить неэффективные циклы или чрезмерную нагрузку на DispatchQueue.

Профессиональный совет: отсортируйте трейсы по «тяжелому весу», чтобы найти самые затратные функции.

Почему это важно: 80% проблем с производительностью связаны с 20% вашего кода.

2️⃣ Оптимизируйте Auto Layout с помощью isActive.

Проблема: сложные иерархии ограничений приводят к тому, что проходы компоновки резко увеличивают нагрузку на процессор.

Решение: активируйте/деактивируйте ограничения массово, а не добавляйте/удаляйте их по отдельности:

NSLayoutConstraint.activate([ view.topAnchor.constraint(equalTo: parent.topAnchor), view.leadingAnchor.constraint(equalTo: parent.leadingAnchor) ])


Бонус: используйте UIStackView для более простых макетов и меньшего количества ограничений.

3️⃣ Сокращайте динамическую диспетчеризацию с помощью final и private.

Хак Swift: помечайте классы как final, а методы как private, чтобы обеспечить оптимизацию компилятора:

final class NetworkManager { private func fetchData() { ... } // Static dispatch for faster execution }


Зачем: динамическая диспетчеризация (например, переопределение методов) увеличивает накладные расходы во время выполнения.

4️⃣ Кешируйте дорогостоящие операции.

Пример: хранение декодированных изображений, ответов сети или вычисленных значений:

let imageCache = NSCache() ​func loadImage(url: URL) -> UIImage? { if let cachedImage = imageCache.object(forKey: url.absoluteString as NSString) { return cachedImage } // Decode and cache... }


Пример использования: избегайте повторения тяжелых задач, таких как декодирование изображений или разбор JSON.

5️⃣ Используйте CALayer.shouldRasterize для сложных представлений.

Когда: рендеринг сложных теней, трансформаций или анимаций.

Как: растеризуйте статичные слои в bitmap изображение один раз:

layer.shouldRasterize = true layer.rasterizationScale = UIScreen.main.scale


6️⃣ Выгружайте работы в фоновые потоки.

Золотое правило: держите основной поток свободным для обновления пользовательского интерфейса.

DispatchQueue.global(qos: .userInitiated).async { let processedData = parseLargeJSON() DispatchQueue.main.async { self.updateUI(with: processedData) } }


Избегайте: блокирования основного потока синхронными вызовами или тяжелыми вычислениями.

7️⃣ Используйте UILabel.preferredMaxLayoutWidth для ячеек.

Проблема: неправильная ширина меток заставляет выполнять лишние проходы по макету.

Исправление: установите preferredMaxLayoutWidth, чтобы избежать двусмысленных ограничений:

label.preferredMaxLayoutWidth = UIScreen.main.bounds.width — 32


Результат: более быстрая прокрутка UITableView/UICollectionView.

8️⃣ Выбирайте UIImage(named:) вместо UIImage(contentsOfFile:).

Почему: UIImage(named:) автоматически кэширует изображения в памяти, а contentsOfFile: — нет.

Лучше всего подходит для: часто используемых ресурсов (иконок, графики пользовательского интерфейса).

9️⃣ Минимизировать drawRect: переопределения.

Издержки: кастомное рисование требует больших затрат процессора.

Альтернатива: используйте предварительно отрисованные изображения или свойства слоя (например, cornerRadius, borderWidth).

🔟 Лениво загружайте невидимое содержимое.

Стратегия: отложите загрузку внеэкранных представлений, данных или медиа.

lazy var analyticsManager: AnalyticsManager = { return AnalyticsManager() // Initialize only when first accessed }()


Применяйте: для тяжелых объектов, баз данных или SDK сторонних разработчиков.

Библиотека мобильного разработчика #свежак
5🔥1
👨‍💻📈 Исследование IT-аудитории Proglib 2025: зарплаты, технологии, профессии

Кто такой современный разработчик в 2025 году? Актуальное исследование портрета IT-специалистов: зарплаты, технологии, специализации и демография разработчиков.

👉 Читать статью

Библиотека мобильного разработчика #свежак
2
👨‍💻 Shader Ripple Effect Playground — библиотека шейдерных AGSL эффектов

Shader Ripple Effect Playground — библиотека шейдерных AGSL эффектов для Android. Есть эффект пульсации, реагирующий на касание, непрерывная волновая анимация с настраиваемыми параметрами, переход раскрытия содержимого с эффектом пульсации — все с настрйоками. Полная совместимость с любым элементом пользовательского интерфейса Jetpack Compose, простая интеграция с минимальным количеством кода.

⚙️ Shader Ripple Effect Playground на GitHub

Библиотека мобильного разработчика #буст
👍4
🎧 Подкасты и видео о мобильной разработке

Собрали лучшее о мобильной разработке. Включаем и смотрим по пути на работу.

🎯 Дивный мир Swift Concurrency

🎯 Разработка под Apple Vision Pro

🎯 Мапим данные из domain в ui модуль в многомодульном проекте

Библиотека мобильного разработчика #буст
1
💵💻🌍 Как выйти на валютную удаленку и зарабатывать больше

Работа на зарубежные компании кажется идеальным вариантом: высокий доход, финансовая стабильность, свободный график.

Но реально ли получить такую работу, если ты живешь в другой стране и какие подводные камни мы разобрали в первой части статьи.

Что вы узнаете:

🔘 Плюсы и минусы работы на иностранные компании

🔘 Ключевые требования к кандидатам

🔘 Сложности, с которыми можно столкнуться

Если давно задумывались о переходе на валютную удаленку, но не знали, с чего начать — этот гайд для вас 🔗
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
Команды дня: cброс коммитов

Предположим, вы сделали коммит в своём проекте. Однако после проверки вы понимаете, что вам нужно скорректировать или полностью отменить последний коммит. Для таких случаев Git предоставляет следующие команды:

🔹 Soft reset

git reset --soft HEAD^


Эта команда позволяет вернуться к последнему коммиту, сохранив все изменения в области подготовки. Проще говоря, с помощью этой команды можно легко отменить коммит, сохранив изменения в коде. Это удобно, когда вам нужно пересмотреть последний коммит, возможно, добавить больше изменений перед повторным коммитом.

🔹 Mixed reset

git reset --mixed HEAD^


Это поведение по умолчанию, когда вы используете git reset HEAD^ без указания --soft или --hard. Он сбрасывает последний коммит и удаляет изменения из области подготовки. Однако эти изменения остаются в рабочей директории. Это полезно, когда вы хотите отменить последий коммит и внести изменения с нуля, сохранив изменения в рабочей директории перед повторным коммитом.

🔹 Hard reset

git reset --hard HEAD^


Напоследок давайте поговорим о команде git reset --hard HEAD^. Она полностью стирает последний коммит вместе со всеми связанными с ним изменениями из вашей истории Git. Когда вы используете флаг --hard, пути назад уже не будет. Поэтому используйте его с особой осторожностью, только если хотите навсегда удалить последний коммит и все его изменения.

Библиотека мобильного разработчика #буст
1
🦊 Альтернативы Firefox: обзор 4 лучших форков для тех, кто разочаровался в Mozilla

Приватность, скорость, расширенные функции — что выбрать? Разбираем популярные форки браузеров и их преимущества.

Что в статье:

✔️ Обзор самых популярных форков браузеров

✔️ Их ключевые фишки, плюсы и минусы

✔️ Как выбрать оптимальный вариант под ваши задачи

Браузер — это не просто окно в интернет, а инструмент, который должен соответствовать вашим требованиям. Делитесь своим опытом в комментариях! 🚀

Прочитать подробнее статью 🔗

🐸 Библиотека тестировщика
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
🤔 Деньги или любимое дело?

Вопрос о выборе между работой, которая не приносит удовольствия, но обеспечивает высокий доход, и любимым делом с низкой зарплатой волнует многих. Каждый из нас сталкивается с этой дилеммой, и порой решение оказывается непростым.

Что важнее для вас: финансовая стабильность или удовлетворение от работы. Какой путь выберете вы? Голосуйте и пишите своё мнение в комментариях 💬

❤️ — работать не нелюбимой работе и много зарабатывать
🤝 — на любимой работе за маленькую зп

Библиотека мобильного разработчика #междусобойчик
15🤝14
📝 Шпаргалка: автозамыкание (autoclosure) в Swift

Автозамыкание оборачивает аргумент функции в замыкание.

Когда вызывается autoclosure, оно возвращает значение выражения, завернутого внутрь.

Автозамыкание — это не что иное, как синтаксическое удобство для написания более чистого кода.

Иногда синтаксически удобно использовать autoclosure при работе с функцией, которая принимает аргумент замыкания.

Это происходит потому, что autoclosure позволяет не использовать фигурные скобки {}.

Это может сделать код более читабельным.

Однако помните, что Apple говорит об использовании автозамыканий :

Обычно принято вызывать функции, которые принимают autoclosure, но не принято реализовывать такого рода функции.


Вот пример того, как autoclosure упрощает код. В первом фрагменте используется обычное замыкание, а во втором — autoclosure. Посмотрите, как вызов функции I_will стал более читабельным во втором фрагменте:


func I_will(_ perform_action: () -> Void) {
perform_action()
}
I_will({
print(«Hello, world!»)
})



func I_will(_ perform_action: @autoclosure () -> Void) {
perform_action()
}
I_will(print(«Hello, world»))


Как видите, вызов функции I_will больше не требует использования фигурных скобок.

Библиотека мобильного разработчика #буст
3😁1
🚰 Топ-7 утечек памяти Android

Утечки памяти — тихие убийцы производительности приложений. Даже в 2025 году, когда Jetpack Compose доминирует в разработке пользовательских интерфейсов и появляются новые модные инструменты, эти ошибки все еще преследуют разработчиков.

Автор статьи разберет 7 наиболее распространенных виновников и вооружит вас проверенными в бою решениями.

👉 Читать статью

Библиотека мобильного разработчика #свежак
👍5🥱21
🗓️ Апрель будет насыщен конференциями и профильными тусовками разного масштаба.

🔹 Gamedev CityFest

Когда: 5 апреля
Где: Новосибирск
Формат: офлайн
Участие: платное

Конференция будет интересна разработчикам игр: как профессионалам направления, так и новичкам, издателям, гейм-дизайнерам, художникам, продюсерам, рекрутерам и другим специалистам индустрии. Участников ждёт три потока докладов, воркшоп и дискуссионная панель на актуальные темы.

🔹 HolyJS 2025 Spring

Когда: 7-8 апреля
Где: Москва
Формат: онлайн и офлайн
Участие: платное

Спикеры на конференции разберут JS-разработку с разных ракурсов: веб-технологии, Node.js, графика и анимации, web3, блокчейн. Будут разобраны реальные кейсы и подняты вопросы безопасности. Участники обменяются опытом, обсудят обновление языка JavaScript, поговорят о фреймворках и инструментах, а также поучаствуют в дискуссиях со спикерами.

👉 Читать полностью

Библиотека мобильного разработчика #свежак
2
🎭 Dev Memes: 1 апреля, а баги всё те же

Сегодня день официально разрешённого троллинга — и мы не могли пройти мимо. Собрали подборку мемов для мобильного разработчика, которые вызывают лёгкое желание уволиться.

👉 Всё это — из нашего мемного канала «Библиотека IT-мемов»

Библиотека мобильного разработчика
😁7
🎰 Инструмент недели: SDK для скретч-карт

Scratchify — это легкий и настраиваемый SDK для скретч-карт, созданный с использованием Jetpack Compose Multiplatform (поддерживает Android и iOS). Он позволяет создавать интерактивные скретч-поверхности, на которых пользователи могут соскрести верхний слой, чтобы открыть скрытый под ней контент. Идеально подходит для поощрений, скидок, сюрпризов и элементов геймификации в вашем приложении.

⚙️ Scratchify на GitHub

Библиотека мобильного разработчика #буст
3