iOS Broadcast
3.4K subscribers
1.76K photos
85 videos
996 links
Подборка новостей и статей для iOS разработчиков.

Новости Kotlin и мультиплатформы @kotlin_broadcast
Новости Android @android_broadcast
Реклама и прочее @ab_manager
Download Telegram
🐥 Фичефлаги в Swift
Фичефлаги - простая пятничная тема на обсудидить. Флаги позволяют включать и выключать определенные функциональные возможности в зависимости от условий. Если вы используете trunk-based подход, то вы точно активно пользуетесь фичефлагами. В статье разбирается базовая реализация фичефлагов, которую можно значительно улучшить. Что бы я заложил, если передо мной стояла задача реализовать фичефлаги в новом приложении:
🟢Фичефлаги бывают локальные и ремоут. Локальные не должно быть возможности переопределять в production конфигурации
🟢Гораздо эффективнее предоставлять API, позволяющее сразу получить значение и подписаться на обновление, тогда экран будет котов к тому что новая конфигурация прилетит в процессе lifecycle
🟢В Debug конфигурации должен быть простой способ управлять фичефлагами
🟢Если управление флагами находится в DEBUG меню, это должно при компиляции исключаться из Production конфигурации
🟢Состояние фичефлагов в каждый момент времени очень важна для отладки и тестирования и должена быть заложена возможнотсь получить снапшот что включено
🟢Критически важно следить за фичефлагами и своевременно их удалять.

Вы используете фичефлаги в своем прилоежнии? Если да, то что бы вы еще отметили? Если нет, то почему?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52
⚠️ Как использовать [weak self] в задачах параллелизма Swift?
Навалим немного базы:[weak self] используется для предотвращения утечек памяти в замыканиях. В обработчиках завершения [weak self] и guard let self используются для проверки существования self перед продолжением выполнения. Но SE-0269 позволяет использовать неявные self-захваты в ситуациях, когда замыкания не сохраняются, что снижает вероятность утечек памяти.

Проблемы с [weak self] в Task
🟢Task начинает выполняться сразу после создания, что уменьшает вероятность освобождения self.
🟢Использование guard let self else { return } в начале Task не предотвращает утечку памяти, так как Task удерживает strong ссылку на self до завершения.

Предотвращение утечек памяти в Task
🟢Можно использовать nil проверку или guard let self else { return } внутри Task для проверки существования self.
🟢Для длительных задач можно перемещать guard let self else { return } внутрь цикла, чтобы захватывать strong ссылку на self только при необходимости.

Рекомендации по использованию [weak self] в Task:
⚠️ Большинство Task замыканий не требуют [weak self], так как Task обычно существует недолго
⚠️ Если необходимо избежать утечек памяти, не используйте guard let self else { return } в первой строке Task
⚠️ Разворачивайте self только тогда, когда это нужно, и храните его как можно короче
⚠️ Используйте self? для избежания полного разворачивания self
⚠️ Если возможно, захватывайте только необходимые свойства, а не весь self
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤔2
🐥 Как Swift Runtime влияет на производительность iOS-приложений
Я помогаю с подготовками статей и это официально самая сложная из них, как в плане материала, так и по доработке подачи. Постарался помочь найти баланс между хардкором и капитаном очевидностью. Комментариев не много, так что либо все понятно, либо вообще ничего не понятно.
Суть рассказа - метод swift_conformsToProtocolMaybeInstantiateSuperclasses который значительно замедляет запуск приложения, а используется повсеместно - as?, as!, String(describing:) и String(reflecting:).
🟢Начинать оптимизацию приложения стоит с более простых вещей
🟢Советы из статьи помогут уменьшить негативное влияния Swift Runtime
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍4🤔1
🐥 Отмена асинхронных задач в SwiftUI
Неустаревающая классика, ручное и автоматическое завершение задач в Swift, сколько провожу собесы, столько разработчики валятся на этом вопросе. Если с NSOperations и GCD еще были нюансы, то в Swift Concurrency, мне казалось, все очевидно. База:
🟢SwiftUI привязывает задачи к жизненному циклу View, что часто приводит к автоматической отмене.
🟢В некоторых случаях может потребоваться явный контроль или запрет отмены.

Использование модификатора .task
🟢Модификатор .task запускается при появлении View и отменяется при его исчезновении.
🟢Пример 1: загрузка элементов при появлении ContentView.

Повторение работы с модификатором .task(id:)
🟢Модификатор .task(id:) запускается при появлении представления и повторяется при изменении идентификатора.
🟢Пример 2: обработка поиска или фильтрации в SearchView.

Проверка отмены в коде
🟢Для длительных циклов или множественных ожиданий полезно явно проверять наличие отмены с помощью try или Task.checkCancellation().
🟢Пример 3: загрузка элементов с проверкой отмены.

Долгоживущие задачи
🟢Задачи, не привязанные к представлению, не отменяются автоматически.
🟢Пример 4: загрузка данных в общий кэш в DataService.

Ручная отмена задач
🟢Можно сохранить ссылку на задачу и вызвать task.cancel() для ручной отмены.
🟢Пример 5: отмена загрузки данных при выходе из системы.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👋 Как мы использовали макросы для внедрения MVVM
Не смог удержаться и не разбавить статью из техблога duolingo мемами про сам duolingo. У кого еще есть любимые мемы про сову, кидайте в комменты

Рост команды и кодовой базы
🔵Команда инженеров iOS значительно выросла за последние несколько лет.
🔵Размер кодовой базы также значительно увеличился.
🔵Команда Client Architecture стандартизировала код на основе MVVM.
🔵Это повысило согласованность кода и скорость разработки.

Использование макросов Swift
🔵Макросы генерируют новый код во время компиляции, оперируя с AST
🔵Они позволяют сократить количество шаблонов и сохранить ясность кода
🔵Макросы используют расширения Key для сбора контекста
🔵Пример: автоматическое создание реализации KeyValueDataSource
🟢Макросы экономят время и снижают вероятность ошибок
🔴Недостатки: код недоступен для поиска в Xcode, иногда требуется перестраивать пакет
🔴Добавление макросов увеличило время сборки
🟢Решение: выгрузка бинарника в S3

Результаты
🟢В базе кода iOS более 4300 строк сгенерированного макросами кода
🟢Макросы упрощают разработку и улучшают качество кода
🟢Макросы используются для автоматической генерации протоколов и инициализаторов
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥1