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

Новости Kotlin и мультиплатформы @kotlin_broadcast
Новости Android @android_broadcast
Реклама и прочее @ab_manager
Download Telegram
📁 Дублирование в программировании
Немного базы, я сам пропагандирую схожую позицию, если копирование снижает когнитивную нагрузку и не несет рисков бизнес логике - не стоит прибегать к преждевременному рефакторингу. Дублирование не всегда является антипаттерном. Плохие абстракции и тесная связь хуже дублирования.

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

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

Общие рекомендации
🟢Хранилища баз данных, внешние клиенты 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
🔨 Stanford CS193p лекция 3 Model & UI + Swift Type System
В новой лекции разбираются фундаментальные принципы работы SwiftUI через призму архитектуры модели и системы типов Swift — то, что определяет устойчивость и масштабируемость iOS-приложений.
Перемешивание UI и логики. Во многих SwiftUI-проектах View начинает обрастать обязанностями: хранением данных, обработкой логики, сетевыми вызовами. Это приводит к:
🟡Трудному тестированию
🟡Отсутствию переиспользования
🟡UI, зависимому от внутренних деталей хранения данных

Чёткое разделение Model ↔️ View
Связка Model и UI — центральная концепция лекции. SwiftUI ожидает, что:
🟡Model хранит истинное состояние и бизнес-логику.
🟡View — чистая функция состояния: она описывает интерфейс, но не владеет логикой.
Это делает приложение устойчивым к изменениям и легко тестируемым.

Swift Type System как фундамент архитектуры. Лекция подчёркивает важность системы типов Swift:
🟡Struct как основной строительный блок данных. Value-semantics уменьшают количество багов, связанных с состоянием.
🟡Enum + associated values. Мощный инструмент для моделирования состояний экрана: loading / success / error.
🟡Optionals. Встроенная безопасность, которая заставляет проектировать модель осознанно.
🟡Immutability по умолчанию. View остаются предсказуемыми, изменения происходят только в модели.

MVVM как естественный путь
CS193p фактически показывает MVVM-подход, но без перегибов:
🔵Model — данные и логика.
🔵ViewModel — источник правды для View, объявленный через @Observable / @StateObject.
🔵View — рендер состояния, без тяжёлой логики.

Выводы:
🔵Избегайте логики в View — переносите в модель или ViewModel.
🔵Используйте enum-состояния для сложных процессов (загрузка, ошибки, пустые состояния).
🔵Стройте данные на основе struct — меньше сайд-эффектов и легче тестировать.
🔵Используйте Optional осознанно: они должны отражать реальную модель данных.
🔵Делайте View чистой функцией состояния — UI становится стабильнее и проще.
#cs193p
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1