iOS Broadcast – Telegram
iOS Broadcast
3.46K subscribers
1.84K photos
86 videos
1.04K links
Подборка новостей и статей для iOS разработчиков.

Новости Kotlin и мультиплатформы @kotlin_broadcast
Новости Android @android_broadcast
Реклама и прочее @ab_manager
Download Telegram
🔱 Создавайте с головой для того чтобы получалось быстро.
Статья о том, как рост и успех компании могут быть подорваны из-за неправильного подхода к оптимизации. Команда Tuist рассказывают о паттерне "Перемещение нагрузки" в системах мышления, который приводит к симптоматическому решению проблем. В статье рассматривается метрика "Пропускная способность мержа", которая сигнализирует о состоянии инженерной организации.В статье подчеркивается важность оптимизации рабочих процессов, а не только оборудования, для повышения эффективности, естественно на примере Tuist:

Merge Throughput: Ключевой показатель
🟡Merge throughput — это количество успешных изменений кода, которые попадают в основную ветку каждый день.
🟡Этот показатель отражает скорость доставки функций, исправления ошибок и реакции на рыночные требования.
🟡С ростом команды merge throughput может снижаться, что указывает на проблемы в процессе разработки.

Фаза 1: Одинокий волк
🟡Основатель запускает стартап и работает один, используя AI-ассистенты.
🟡Скорость разработки высока, но нет контроля качества, что приводит к критическим ошибкам.

Фаза 2: Добавление безопасности
🟡Основатель добавляет CI и нанимает первого инженера.
🟡Процесс разработки становится медленнее, но стабильнее благодаря проверкам и ревью.

Фаза 3: Умножение команды
🟡Команда растет до пяти инженеров, но merge throughput не увеличивается пропорционально.
🟡Проблемы: задержки в ревью, частые конфликты, нестабильные тесты, нехватка CI-раннеров.

Фаза 4: Стена сложности
🟡Команда растет до 30 инженеров, но merge throughput остается низким.
🟡Проблемы: длительные CI, частые конфликты, нестабильные тесты, задержки в ревью.

Фаза 5: Ловушка грубой силы
🟡Команда предлагает три решения: более мощные машины, больше людей, переписывание кода.
🟡Все эти решения имеют недостатки и не решают основную проблему.

Фаза 6: Умная оптимизация
🟡Интеграция Tuist позволяет использовать бинарный кеш и выборочное тестирование.
🟡Только измененные модули перекомпилируются, только затронутые тесты выполняются.
🟡Это значительно сокращает время CI и улучшает эффективность.

Выводы:
🟢Компании часто сначала оптимизируют аппаратное обеспечение, что дает лишь небольшие улучшения.
🟢Увеличение числа разработчиков приводит к большей координации и конфликтам.
🟢Переписывание кода может решить одни проблемы, но создать другие.
🟢Оптимизация рабочих процессов, а не аппаратного обеспечения, дает значительные результаты.
🟢Бинарный кеш и выборочное тестирование сокращают время CI и повышают производительность.

Вы сталкивались с подобными проблемами? Самые интересные проблемы приходят при росте 100+ разработчиков, но на этом уровне уже нужен не Tuist
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
2
🔱 Учим AI читать логи Xcode Build
Продолжаю делиться последними хайлайтами из блога Tuist. На этот раз про интересную точку приложения AI в той области, где знаний даже у опытных разработчиков порой не хватает: Анализ логов сборки Xcode
🟢Система сборки Xcode не оптимизирована для понимания агентами ИИ.
🟢XCSift преобразует выходные данные сборки в структурированный JSON для использования ИИ.
🟢Протоколы сборки содержат структурированные данные, но они не всегда доступны для анализа.
🟢Структурированные данные сборки могут помочь агентам ИИ в диагностике и оптимизации сборок.
🟢Протоколы сборки могут использоваться для анализа производительности и зависимостей.
🟢Структурированные сообщения могут помочь агентам ИИ задавать вопросы о сборках на естественном языке.
🟢Протоколы сборки могут быть использованы для хранения и обработки данных о сборках.
🟢Корреляция данных сборки и запросов агентов ИИ является ключевым моментом для эффективного использования структурированных данных.

Ключевые выводы
🔵Система сборки сложнее, чем кажется, и требует детального инструментария.
🔵Структурированные данные в корне меняют возможности ИИ для анализа и оптимизации сборки.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
📁 Дублирование в программировании
Немного базы, я сам пропагандирую схожую позицию, если копирование снижает когнитивную нагрузку и не несет рисков бизнес логике - не стоит прибегать к преждевременному рефакторингу. Дублирование не всегда является антипаттерном. Плохие абстракции и тесная связь хуже дублирования.

Классы моделей данных
🟢Классы моделей данных используются для обмена данными между службами.
🟢Зависимость от модели данных может привести к проблемам с обновлением и разветвлению.

Код бизнес-логики
🟢Бизнес-логика, зависящая от контекста, должна быть продублирована.
🟢Универсальная бизнес-логика должна быть в одном месте.
🟢Предпочитайте дублирование неправильной абстракции.

Общие рекомендации
🟢Хранилища баз данных, внешние клиенты API и служебные функции не должны дублироваться.
🟢Важно учитывать контекст и последствия изменений при принятии решений о дублировании.
🟢Если что-то нужно продублировать один раз - это норма, если второй раз - повод задуматься
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🔨 CS193P Лекция 2
🟢Переменная body как вычисляемое свойство.
🟢Использование v-стека для организации элементов.
🟢Аргументы v-стека
🟢• Комбинирование видов с помощью v-стеков и h-стеков.
🟢Представление контента как комбинация других представлений.
🟢Функция main и структура приложения.
🟢Работа с модификаторами
🟢Модификаторы и VStack
🟢Введение в игру «Взломщик кода»
🟢Добавление отступов и использование VStack
🟢Декомпозиция кода
🟢Функции и аргументы
🟢Работа с массивами в Swift
🟢Статические переменные цвета
🟢Вывод типов в Swift
🟢Работа с отладчиком
🟢Использование прозрачности для скрытия элементов.
🟢Предварительный просмотр

#cs193p
Please open Telegram to view this post
VIEW IN TELEGRAM
4
🍎 Добавляем Контакты прямо из SwiftUI
В статье показано, как без UIKit и мостов, на SwiftUI + Contacts.framework — реализовать экран, где пользователь может заполнить форму и сохранить новый контакт прямо в адресную книгу. Решил что полезно, т.е. большинство подобных туториалов используют устаревшее API.
Что это даёт разработчику:
🔵Полная нативная запись контактов из SwiftUI.
🔵Контроль над UI формы: свои валидации, кастомный дизайн, логика до/после сохранения.
🔵Удобно для мессенджеров, CRM-фич, социальных приложений и любых, кто работает с контактами.

Важно:
🔵Запросить разрешение на доступ к контактам (Privacy - Contacts Usage Denoscription).
🔵Использовать CNMutableContact + CNSaveRequest для записи.
🔵Обработать пользовательский отказ — UX должен быть понятным.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1
📱SwiftUI + SharePlay: смотри видео вместе с друзьями
Очень интересно и скорее всего вообще никому не пригодится. Обожаю эти фичи, которые мы видим на WWDC и больше никогда не используем в реальной жизни. SharePlay одна из таких фичей, возможно кто-то из вас нашел ей применение? В статье рассказано как с помощью Group Activities и AVFoundation сделать в iOS-приложении возможность смотреть видео синхронно на нескольких устройствах.
🔵Групповой просмотр — через FaceTime/SharePlay, синхронизация старта, паузы, позиции.
🔵Возможность менять видео для всей группы, присоединяться/покидать сеанс.
🔵Всё реализовано на SwiftUI + нативных API — без UIKit-та.

Что нужно сделать:
🔵Создать GroupActivity, описать метаданные (URL, noscript и т.д.).
🔵При старте вызвать prepareForActivation() → activate(), либо локально воспроизвести.
🔵Подписаться на sessions(), получить GroupSession, подключить playbackCoordinator к AVPlayer.

API очень удобный и интуитивный. Кто-то считает это может стать однажды популярным или уже придумал для чего использовать?
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🔨 Как мониторить производительность iOS-приложения после релиза — MetricKit
Как с помощью MetricKit можно собирать реальные метрики от пользователей: загрузка CPU/памяти, I/O, время запуска, энергопотребление, крэши, hangs и многое другое.

Преимущества:
🟢Данные приходят автоматически — не нужно просить фидбек от пользователей.
🟢Понятные метрики: launch time, memory/CPU, disk and network I/O, energy, hangs.
🟢Можно найти реальные проблемы производительности и оптимизировать до того, как жалобы попадут в App Store.

Что нужно сделать:
🔵Подключить MetricKit.
🔵Добавить подписчика на MXMetricManager.
🔵После публикации — ждать первый отчёт.
🔵Анализировать метрики / крэши / использование ресурсов.

А если хотите пойти дальше, добро пожаловать предлагаю посмотреть мой доклад на эту тему:
🎞 Надежность мобильных приложений: что это и как достичь про то какие еще есть метрики и как их лучше собирать
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3
🐥 Swift Concurrency: как избежать retain-циклов в Task
Работа с async/await и Task в Swift сильно упрощает асинхронный код, но ARC всё ещё делает своё — задачи захватывают объекты, которые используются внутри тела, и могут неявно удерживать память дольше, чем вы думаете. Это может привести к retain-циклам даже без UIKit-замыканий.

Что происходит под капотом:
🔵Когда вы создаёте Task { … }, Swift сильно удерживает все объекты, на которые ссылается тело задачи. Это стандартное поведение ARC: задачи держат захваченные значения до завершения.
🔵Если у вас есть объект, который сохраняет задачу как своё свойство, и в теле задачи вы захватываете self, получается временный retain-цикл: Owner → task → Owner
🔵Задача отпустит захваченные значения когда она завершится — так что цикл существует только на время выполнения задачи.

Когда это становится проблемой
🟡Если задача запускается и заканчивается быстро — чаще всего можно не беспокоиться: цикл временный и «самоустраняется».
🟡Но если задача долго живает (например, постоянный цикл, слушатель, стрим, background-loop) — цикл может превращаться в настоящую утечку памяти: объект удерживает задачу, а задача удерживает объект.

Как избежать retain-циклов?
🟡Слабые захваты weak self в задачах
task = Task { [weak self] in
guard let self else { return }
await self.loadData()
}


🟡Отмена долгоживущих задач
Если ваша задача запущена на View и должна завершиться при исчезновении UI — отменяйте её вручную: task.cancel(). Task отменяется, и память освобождается быстрее
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52🤔1