Мобильный трудоголик
1.37K subscribers
61 photos
9 videos
266 links
👨‍💻 Пишу простым языком об iOS разработке на Swift и мобильной разработке в целом.
🔹 Вошел в IT задолго до того как это стало мейнстримом.
---
‍Обо мне: https://t.me/hardworkerIT/3
Чат: @hardworkerChatIT
Канал про разработку и жизнь в ИТ: @itDenisov
Download Telegram
🤖 Vibe-coding vs Prompt-engineering: два подхода к работе с ИИ.

Опытные разработчики чаще принимают ИИ-инструменты, чем новички. Возможно, дело в уверенности: сеньоры не боятся что их заменят, а видят в ИИ помощника.


1️⃣ Vibe-coding.

Как работает:
Бросаешь задачу в ChatGPT (или другие ИИ), получаешь готовый код и слегка его правишь.

Проблема:
Нет глубокого понимания кода, ментальная модель не строится.

Когда использовать:
Только для быстрых прототипов и экспериментов.

Риски:
Код может быть неоптимальным и со скытыми багами.


2️⃣ Prompt-engineering.

Как работает:
Тщательно проектируешь запросы, задаешь контекст, формат и ограничения, получаешь точный результат.

Преимущество:
Полный контроль над процессом, понимание каждой строки кода.

Идеально для:
Рутинных задач, шаблонного кода и документации.

Аналогия:
Как менторить джуна: даешь четкие инструкции и проверяешь результат.


⚠️ Ключевое отличие:

Vibe-coding: эмоциональный подход «сгенерируй что-нибудь».
Prompt-engineering: инженерный подход «дай мне конкретное решение под мои требования».


Как использовать ИИ эффективно:

🔹 Всегда включать голову: не важно откуда код: из ИИ, Stack Overflow или из статьи.
🔹 Дробить задачи: давать ИИ конкретные мелкие задания вместо «сделай все».
🔹 Тестировать и проверять: любой сгенерированный код требует ревью и тестов.
🔹 Учиться формулировать: прокачивать навык написания четких промтов.


💡 Вывод:

ИИ не замена разработчику, а мощный инструмент. Как молоток: можно собрать мебель, а можно разбить палец. Все зависит от того, кто и как его использует.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍221512🔥3🤔1🙏1
👨‍💻 IT-кризис: почему айтишники стали одними из самых безработных.

Шокирующая статистика из США: каждый 15-й молодой IT-специалист сейчас без работы. Среди программистов уровень безработицы достигает 7.5% — это выше, чем у гуманитариев и биологов!


🤔 Что происходит?

🔸 Массовые сокращения в гигантах типа Amazon, Microsoft и Intel.
🔸 Вакансий для джунов стало на 21% меньше.
🔸 Нейросети забирают задачи новичков: код-ревью, тестирование, шаблонный код.
🔸 Переизбыток выпускников: 170K дипломов за год (вдвое больше чем 10 лет назад).


⚠️ Глубинные причины:

🔸 Индустрия повзрослела: меньше стартапов, больше поддержки легаси.
🔸 Смещение фокуса на senior-специалистов вместо массового найма джунов.
🔸 ИИ-революция: ChatGPT и Copilot заменяют начинающих разработчиков.
🔸 Постковидная коррекция: переоценка штата после бума удалёнки.


Что делать начинающим:

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


💡 Вывод:

Рынок труда для новичков в IT серьёзно изменился. Теперь недостаточно просто закончить курсы, нужно предлагать реальную ценность и адаптироваться к новым реалиям.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16👀10🤯52🤔1🙏1🗿1
Работаем с таймерами через AlarmKit: новый фреймворк Apple.

На WWDC 2025 представили AlarmKit — фреймворк для создания будильников и таймеров, которые работают даже в беззвучном режиме и при активном Focus. В отличие от обычных уведомлений, AlarmKit всегда показывает баннер и воспроизводит звук!


1️⃣ Запрос разрешения.

Добавим в Info.plist ключ NSAlarmKitUsageDescription с описанием, зачем приложению нужны таймеры. Затем запросим авторизацию:


import AlarmKit

let manager = AlarmManager.shared
let state = try await manager.requestAuthorization()



2️⃣ Настройка таймера.

Создадим кастомизированный алерт и атрибуты:


let alert = AlarmPresentation.Alert(
title: "Готово!",
stopButton: AlarmButton(text: "Готово", systemImageName: "checkmark")
)

let attributes = AlarmAttributes<TimerData>(
presentation: AlarmPresentation(alert: alert),
tintColor: .blue
)

let timer = try await manager.schedule(
id: UUID(),
configuration: .timer(duration: 30, attributes: attributes)
)



3️⃣ Live Activity и Dynamic Island.

Добавим виджет для отображения обратного отсчета на экране блокировки и в Dynamic Island:


// В виджете:
Text(timerInterval: Date.now...countdown.fireDate)
.monospacedDigit()



4️⃣ Список активных таймеров.

Использование alarmUpdates для отслеживания состояния:


for await alarms in AlarmManager.shared.alarmUpdates {
// Обновляем список таймеров
}



⚠️ Практические советы.

🔹 Всегда проверяйте статус авторизации authorizationState перед планированием.
🔹 Используйте кастомные метаданные через AlarmMetadata для передачи дополнительной информации.
🔹 Для паузы/возобновления используйте методы pause() и resume().
🔹 Обрабатывайте ошибки отмены через try-catch.


Важные ограничения.

🔸 Максимальное количество активных будильников: 50 на устройство.
🔸 Минимальная длительность таймера: 1 секунда.
🔸 Максимальная длительность: 23 часа 59 минут 59 секунд.


💡 Вывод:

AlarmKit — мощный инструмент для создания надежных таймеров, но требует настройки нескольких компонентов. Идеально для кулинарных таймеров, напоминаний и любых приложений, где важно точное время.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2075🔥2🙏1
👨‍💻 Ускоренная проверка приложений в App Store: как это работает.

Знаете ли вы, что можно ускорить модерацию приложения в App Store? Рассказываю про официальный способ от Apple - Expedited App Review.


⚠️ Как это работает:

🔸 Заполняете форму на сайте Apple Developer.
🔸 Уже через 15 минут приложение переходит в статус «На проверке» (вместо стандартных 1-3 дней!).
🔸 В среднем за 25-30 минут проверка завершается и приложение готово к релизу.


Особенности:

🔹 Автоповтор: если билд отклонили, следующий билд с исправлением проблемы автоматически пройдет ускоренную проверку.
🔹 Без лишних вопросов: не нужно объяснять причину (но лучше иметь вескую).
🔹 Работает для обновлений: не только для новых приложений, но и для апдейтов.
🔹 Срочные фиксы: идеально подходит для критических багов или срочных юридических требований.
🔹 Только для отправленных билдов: ускоренной обработке подлежат только те заявки, которые уже были отправлены на обычную проверку в App Store Connect.


Ограничения и минусы:

🔸 Не для частого использования: Apple рекомендует использовать не более 1-2 раз в год.
🔸 Могут отказать: если сочтут причину недостаточно веской (письмо придет на почту).
🔸 Не для всех случаев: не подходит для обычных обновлений без срочности.
🔸 Риск израсходовать возможность: при злоупотреблении могут временно заблокировать доступ к данной функциональности.


⚙️ Как отправить заявку:

🔹 Перейдите на страницу связи с поддержкой Apple Developer.
🔹 Выберите App Review, затем Expedited App Review Request.
🔹 Заполните форму.
🔹 Отправьте и ждите результата.

Так же, можно сразу перейти на страницу Expedited App Review по ссылке.


💡 Вывод:

Expedited App Review - отличный инструмент для критических ситуаций, но не стоит использовать его для каждого обновления.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
16👍82🔥1🙏1
👨‍💻 Реальная жизнь айтишника: не только код и кофе.

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


Утро: запускаем мозг правильно.

Не стоит сразу садиться за ноутбук, сначала нужно правильно настроиться на работу. Вот что может помочь:
🔹 Контрастный душ или хотя бы обычный, это поможет проснуться лучше чем кофе.
🔹 Стакан воды и легкая зарядка.
🔹 Свежий воздух (открытое окно или короткая прогулка).
🔹 Спокойный завтрак без смартфона (без ленты новостей и рабочих чатов).


🏢 Офис vs удаленка: где лучше?

В офисе:
Легче синхронизироваться с командой.
Четкие границы рабочего времени.
Требует времени на дорогу и подготовку.

Дома:
Лучше для глубокой концентрации.
Гибкий график.
Нужна самодисциплина и отдельное рабочее место.


🗓 Как организовать рабочий день:

🔹 Программирование занимает только ~50% времени.
🔹 Остальное: созвоны, обсуждения, планирование.
🔹 Делайте перерывы каждые 1.5-2 часа.
🔹 Вставайте из-за стола, пройдитесь, разомнитесь.


⚠️ Опасность ночной работы:

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


🏃‍♂️ Баланс и хобби:

🔸 Обязательно занимайтесь спортом или физической активностью.
🔸 Выбирайте хобби, не связанные с компьютером.
🔸 Живое общение с друзьями лучше соцсетей.
🔸 Не работайте в выходные — это путь к выгоранию.


❤️ Главные правила:

🔹 Работайте в рабочее время.
🔹 Отдыхайте без чувства вины.
🔹 Двигайтесь, сидячий образ жизни убивает.
🔹 Находите время для себя и близких.


💡 Вывод:

Успешный айтишник не тот, кто кодит 24/7, а тот кто умеет грамотно организовать свой день, отдыхать и сохранять баланс.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥174👍21
👨‍💻 Vibe code cleanup specialist: новая профессия в эпоху ИИ.


С появлением нейросетей в программировании возник неожиданный тренд — всё чаще требуется не просто сгенерировать код, а довести его до ума. Так родилась новая роль: Vibe code cleanup specialist — специалист, который превращает сырой ИИ-код в чистый, поддерживаемый и эффективный код.

Эти эксперты уже активно предлагают свои услуги на фриланс-биржах и даже добавляют этот навык в резюме. Их задача — не просто исправить ошибки, но и улучшить читаемость, оптимизировать производительность и адаптировать код под стандарты проекта.

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


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1432🔥1🙏1👀1
📱 Как устроена работа с камерой в iOS: краткий разбор.

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


🧩 Основные компоненты:

🔸 Input: устройство, которое может передавать видео, фото или аудио. Например задняя камера, фронтальная камера или встроенный микрофон.
🔸 Output: фактический вывод устройства. Это может быть фото или видео сохраненные на диске. Либо обработанный вами объект. Например: обнаруженные лица, отсканированные штрихкоды или примененные фильтры.
🔸 Preview: вывод изображения с камеры.
🔸 Stream: непрерывный поток кадров. Обычно вы снимаете один кадр как фотографию или серию кадров как видео. Хотя современные камеры часто объединяют кадры из-за слабого освещения, уменьшения шума и т. д. Поток также доступен для предварительного просмотра.
🔸 Session: объект, предоставляющий интерфейс для добавления/удаления входов и выходов, а также настройки конфигурации сеанса. Позволяет начинать и завершать сеанс.


⚠️ Важные нюансы:

🔸 Захват фото: асинхронный: метод capturePhoto не возвращает фото сразу — камере нужно время на фокусировку, экспозицию и, возможно, вспышку.
🔸 Разное качество: фото захватываются в максимальном разрешении, а превью — в низком для плавности.


🗃 Типичный поток данных:


Камера -> AVCapturePhoto -> Декодирование -> CGImage -> Image (SwiftUI) -> отображение на экране


Либо сохранение в Фото -> PHAsset (ссылка на медиатеке).


💎 Ключевые различия форматов:

🔹 AVCapturePhoto: сырые данные с камеры (ещё не отображенные).
🔹 PHAsset: ссылка на фото/видео в медиатеке (не содержит пиксели).
🔹 CGImage: растровое изображение (можно рисовать).
🔹 Image (SwiftUI): view для отображения.


💻 Тестирование:

🔹 На iOS-симуляторе камера не работает, поэтому лучше тестировать на реальном устройстве.
🔹 На macOS можно тестировать через встроенную камеру Mac.


💡 Вывод:

AVFoundation — мощный, но сложный фреймворк. Главное — понять роль каждого компонента и их взаимодействие.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1543👍1👏1👀1🤝1
🔢 Что нового в UIKit для iOS 26: главные фичи.

В iOS 26 UIKit получил множество обновлений, которые упрощают разработку и добавляют новые возможности. Вот основные изменения:


🎨 UIGlassEffect.

Liquid Glass — главная фишка iOS 26:
🔹 UIGlassEffect: стильные стеклянные эффекты Liquid Glass с настройкой цвета и интерактивности.
🔹 UICornerConfiguration: гибкое управление скруглением углов (вплоть до адаптивных под форму экрана).
🔹 Обновлённые UIBarButtonItem: новые стили, бейджи и улучшенная анимация между навигационными панелями.


📝 UITextField и UITextView.

🔹 В UITextField появились новые методы для поддержки функции Natural Selection:
— textField(_:shouldChangeCharactersInRanges:replacementString:) заменяет старый метод.
— textField(_:editMenuForCharactersInRanges:suggestedActions:) также обновлён.
🔹 UITextView теперь использует selectedRanges вместо selectedRange, что улучшает работу с текстом, содержащим смешение направлений (LTR и RTL).


🖼️ Работа с цветом.

🔹 HDR-цвета в UIColor: поддержка высокого динамического диапазона с контролем экспозиции.
🔹 Обновлённый UIColorPickerViewController: слайдер для настройки HDR и опция отключения пипетки.


📱 Навигация и интерфейс.

🔹 UINavigationItem теперь поддерживает:
— Attributed-заголовки и подзаголовки.
— Кастомные subtitleView и largeSubtitleView.
— Гибкое размещение searchController (в навигационной панели или тулбаре).
🔹 Интерактивное закрытие: свайп для возврата (работает даже со скрытой кнопкой назад).

🎛 Split View и Inspector.

🔹 Новая колонка Inspector в UISplitViewController: для боковых панелей в стиле macOS.
🔹 Гибкая настройка ширины: минимальные/максимальные значения для secondary и inspector колонок.


🔄 UIAction и UIApplicationDelegate.

Добавлены новые идентификаторы действий, а также постепенно происходит переход от UIApplicationDelegate к UISceneDelegate и UIWindowSceneDelegate.


👔 Обновлённые компоненты.

🔹 UISlider: новые стили (включая бесползунковый) и гибкая настройка трека с тиками.
🔹 UITabBarController: bottomAccessory для плавающих панелей (как в Music).
🔹 Свертывание таббара: автоматическое скрытие при прокрутке.


⚙️ Технические улучшения.

🔹 Наблюдение за свойствами: автоматический трекинг изменений в @Observable объектах.
🔹 Анимации: новый параметр .flushUpdates для автоматического обновления констрейнтов.
🔹 Безопасная область: новый LayoutRegion с учётом скруглений экрана и системных элементов.


⚠️ Важно:

🔸 Многие deprecated-методы UIApplicationDelegate перенесены на UISceneDelegate.
🔸 Улучшена поддержка правого-налево и смешанного текста (Natural Selection).
🔸 VisionOS: сохранение окон в пространстве и опции их автоматического удаления.


Это лишь часть изменений, но уже очевидно, что iOS 26 делает UIKit мощнее и удобнее для разработчиков.


💡 Вывод:

UIKit всё ещё жив и активно развивается, особенно в области кастомизации, HDR и адаптации под новые форм-факторы.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
18🔥44👍1🤝1
👨‍💻 Зачем разработчику софт-скиллы?

Знакомо чувство, когда кажется, что твоя работа просто писать код, а все остальное (бизнес-логика, коммуникация, командная работа) должно волновать кого-то другого? Давайте разберемся, почему это опасное заблуждение.


⚠️ Реалии рынка:

🔸 Компаниям нужны команды, а не гении-одиночки. 90% проектов требуют слаженной работы, а не гениального кода одного человека.
🔸 Токсичных спецов терпят только до первого кризиса. Да, есть в ИТ «вундеркинды», которые тянут весь проект самостоятельно, но их карьера коротка и непредсказуема.
🔸 Без софт-скилов вас просто не возьмут. Даже джунам теперь нужны базовые навыки коммуникации.


🤔 Почему софт-скиллы так важны?

🔸 Понимание бизнеса = более верные решения, меньше багов и переделок.
🔸 Коммуникация = умение вовремя донести проблему и правильно понять суть задач.
🔸 Спокойствие и адекватность = меньше конфликтов и токсичности, больше продуктивности.


Как прокачать софт-скиллы?

🔹 Учитесь слушать. Часто проблема не в том, что вы не умеете говорить, а в том, что не слышите других.
🔹 Задавайте вопросы. Лучше уточнить, чем неделями чинить неправильную задачу.
🔹 Обратная связь. Учитесь давать ее корректно и принимать без обид.
🔹 Минимум токсичности. Даже простое «спасибо» в чатах улучшает атмосферу в команде.
🔹 Практикуйте простое объяснение. Если вы можете объяснить задачу так, чтобы понял стажер, значит вы ее и сами хорошо понимаете.


💡 Вывод:

Хороший разработчик нужен всегда, но хороший программист с софт-скилами ценится в разы выше. Такой разработчик быстрее растет, чаще получает интересные задачи и становится тем, кого зовут в проекты снова и снова.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
146👍4🔥1🤯1👀1
🔨 Как подключить Google Gemini к Xcode 26.

Официально в Xcode 26 нельзя просто добавить Gemini, но есть лайфхак с прокси! Рассказываю, как заставить их работать вместе.


В чём проблема:

Xcode ожидает API с классической структурой URL (/v1/...), а у Gemini путь другой — /v1beta/openai/. Но это решаемо!


1️⃣ Добавляем провайдер в Xcode.

Открываем настройки (Settings), Intelligence, Add Model Provider:

Type: Internet Hosted

URL: https://generativelanguage.googleapis.com/

API Key: Bearer YOUR_API_KEY

API Key Header: Authorization

Description: Gemini (или как хотите)


Сохраняем и закрываем Xcode.


2️⃣ Настраиваем прокси.

Скачиваем Proxyman (или другой) и настраиваем перехват запросов от Xcode. После чего добавляем скрипт для подмены URL:


function onRequest(context, url, request) {
request.path = request.path.replace("/v1/", "/v1beta/openai/");
return request;
}


Этот скрипт автоматически исправит пути запросов на лету.


3️⃣ Проверяем работу.

Запускаем Proxyman, затем открываем Xcode, настройки, Intelligence. Видим список моделей Gemini (если всё настроено верно).


4️⃣ Используем в работе.

Пишем как обычно, Xcode будет отправлять запросы через прокси к Gemini. Например: «Добавь кнопку и переведи интерфейс на английский» и код генерируется!


⚠️ Особенности:

🔸 Proxyman должен быть запущен во время работы с Xcode.
🔸 Цена вопроса: Gemini дешевле многих аналогов ($0.125 за 1M токенов).
🔸 Качество: Gemini 2.5 Flash показывает отличные результаты в код-генерации.


Теперь можно использовать Gemini прямо в Xcode 🚀


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1622🔥1👀1🤝1
This media is not supported in your browser
VIEW IN TELEGRAM
🔢 Swift 6.2: теперь можно называть функции с пробелами!

Отличные новости для тех, кто пишет тесты, в Swift 6.2 появилась возможность использовать сырые идентификаторы (Raw Identifiers) для названий функций!


⚠️ Как это работает:

Просто заключаете название функции в обратные кавычки:

// Было:
func testUserLoginWithInvalidCredentials()

// Стало:
func `Test user login with invalid credentials`()



Где это особенно полезно:

🔹 Тесты: читаемые названия с пробелами вместо camelCase.
🔹 DSL и библиотеки: специальные символы в названиях методов.
🔹 Эксперименты: временные функции с описательными названиями.
🔹 Миграция: совместимость с кодом из других языков.


Важные нюансы:

🔸 Работает только с обратными кавычками, без них компилятор ругнется.
🔸 Не злоупотребляйте, для продакшн-кода лучше использовать традиционные имена.
🔸 Отлично сочетается с XCTest, делает названия тестов самодокументируемыми.


💡 Вывод:

Интересная фича, которая особенно порадует авторов тестов и создателей DSL. Теперь можно писать по-человечески, с понятные названиями.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥543🤯1
👨‍💻 Мобильная разработка умирает?

Последнее время всё чаще слышу этот вопрос. Давайте разберёмся: что на самом деле происходит с мобилкой?


Симптомы «кризиса».

🔸 Найм замер – компании берут только сеньоров, джунам пробиться почти нереально.
🔸 Технологический застой – ничего революционного (после SwiftUI, async/await, Flutter, KMM, Jetpack Compose).
🔸 Смартфоны перестали удивлять – Apple и Samsung 5 лет выпускают «одно и то же».
🔸 Конференции скукожились – где тот размах Mobile World Congress или Mobius?


⚠️ Что на самом деле?

Мобильная разработка не умирает – она перестала быть хайповой.
🔹 Mobile-First умер? Да, теперь все говорят про AI-First.
🔹 Значит ли это, что мобилки больше нет? Нет – просто она стала стандартной индустрией, как веб-разработка.


🤔 Что будет дальше?

🔸 Сильные разработчики останутся: спрос на опытных iOS/Android разрабов никуда не денется.
🔸 Новичкам будет сложнее: входной барьер вырос в разы.
🔸 Фокус сместится на интеграцию: AI, AR, кроссплатформа (Flutter, KMM).


💡 Вывод:

Мобильная разработка больше не «золотая лихорадка», но остаётся стабильной областью для профессионалов.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👀16🫡7🗿41🤔1🤯1
🔢 Эффективное управление памятью в iOS: как снизить потребление и избежать проблем.

Работа с памятью — одна из самых сложных тем в разработке мобильных приложений. Если не уделять этому внимание, приложение начнёт тормозить, вылетать или даже «съедать» всю память устройства.

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


🤔 Где искать утечки и как их избежать?


1️⃣ Оптимизация изображений.

Загрузка больших изображений — частая причина утечек. Что делать?

🔹 Используйте Image I/O для создания миниатюр.
🔹 Загружайте картинки лениво (например, через AsyncImage или Kingfisher).
🔹 Храните ассеты в каталогах — они автоматически оптимизируются под разные устройства.


2️⃣ Работа с Core Data.

Core Data хранит изменения в памяти до сохранения (save()). Если откладывать сохранение слишком долго — память заполнится. Если сохранять слишком часто — нагрузка на диск возрастёт. Нужен баланс.


3️⃣ Используйте NSPurgeableData.

Этот класс позволяет системе автоматически освобождать память при нехватке. Просто оберните в него данные и вызывайте beginContentAccess() при необходимости.


4️⃣ Ленивая загрузка (LazyVStack, lazy var).

🔹 В SwiftUI используйте LazyVStack и LazyHStack, чтобы загружать элементы только при появлении на экране.
🔹 В коде применяйте lazy var для редко используемых свойств (например, кэшированных изображений).


5️⃣ Отдавайте предпочтение value-типам (struct, enum).

Они проще в управлении памятью, так как не создают retain-циклов и освобождаются сразу после выхода из области видимости.


6️⃣ Правильное кэширование.

🔹 Используйте NSCache — он автоматически очищается при нехватке памяти.
🔹 Избегайте сильных ссылок на большие объекты.
🔹 Реализуйте свою стратегию очистки (например, по времени или частоте использования).


7️⃣ Удаляйте неиспользуемые объекты.

Если данные больше не нужны (например, пользователь ушёл в другой раздел приложения), освобождайте память: останавливайте таймеры, отменяйте запросы, выгружайте тяжелые ресурсы.


8️⃣ Боритесь с утечками.

🔹 Используйте Memory Graph Debugger в Xcode.
🔹 Проверяйте retain-циклы в замыканиях ([weak self]), делегатах и связях View-ViewController.
🔹 Регулярно запускайте Instruments (Leaks) во время тестирования.


💡 Вывод:

Управление памятью — это баланс между производительностью и потреблением ресурсов. Чем раньше вы начнёте следить за этим, тем стабильнее будет ваше приложение.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
118👍4🙏3🔥21
🔢 Преобразование речи в текст в iOS приложении.

Компания Apple представила новый API SpeechAnalyzer — мощный инструмент для работы с аудио в iOS 26. Рассказываю, как интегрировать его в ваше приложение для преобразования речи в текст.


⚠️ Ключевые компоненты:

AudioManager:
Управляет доступом к микрофону и аудиосессией. Обрабатывает разрешения и потоковую передачу аудиобуферов в реальном времени.

BufferConverter:
Преобразует аудиобуферы между форматами — критично для совместимости с SpeechAnalyzer.

TranscriptionManager:
Координирует весь процесс: запрос разрешений, запуск транскрипции и обработку результатов.


♣️ Особенности реализации:


// Пример обработки аудиобуфера
func processAudioBuffer(_ buffer: AVAudioPCMBuffer) throws {
guard let inputBuilder, let analyzerFormat else { return }
let converted = try converter.convertBuffer(buffer, to: analyzerFormat)
inputBuilder.yield(AnalyzerInput(buffer: converted))
}



Важные нюансы:

🔸 Требуются разрешения Microphone и Speech Recognition.
🔸 Оптимизирован для длинных аудиозаписей.
🔸 Лучше работает с голосом на расстоянии.


Практическое применение:

🔹 Голосовые заметки.
🔹 Субтитры в реальном времени.
🔹 Голосовые сообщения в мессенджерах.
🔹 Голосовое управление приложением.
🔹 Анализ аудиоконтента.


💡 Вывод:

SpeechAnalyzer открывает новые возможности для голосовых интерфейсов. Хотя API ещё сыроват, его уже можно использовать в проектах — главное не забывать про обработку ошибок и проверку разрешений.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥164👍31👏1
🔢 Approachable Concurrency в Swift: новая эра многозадачности.

В Xcode 26 появился революционный подход к работе с многозадачностью: Approachable Concurrency. Это не просто одно изменение, а целый набор фич, которые делают конкурентный код проще и предсказуемее.


⚠️ Что входит в Approachable Concurrency:

🔸 nonisolated(nonsending) By Default: неизолированные async-функции теперь выполняются на исполнителе вызывающего актора.
🔸 Infer Sendable for Methods: автоматическое определение Sendable для методов и key-path.
🔸 Infer Isolated Conformances: автоматическая изоляция протокольных конформянсов под актор типа.
🔸 Глобальная изоляция типов: умное определение безопасного использования неизолированных свойств.
🔸 Отключение неявной изоляции: больше не нужно бороться с неожиданной изоляцией через property wrappers.


👔 Как включить.

В Xcode:

🔹 Идем в Build Settings, затем ищем «Approachable Concurrency».
🔹 Устанавливаем значение: Yes.

В Swift Package:

swift 
// swift-tools-version: 6.2
.target(
name: "MyFeature",
swiftSettings: [
.defaultIsolation(MainActor.self),
.enableUpcomingFeature("NonisolatedNonsendingByDefault"),
.enableUpcomingFeature("InferIsolatedConformances")
]
)



🤔 Почему это важно?

🔸 Меньше неожиданностей: компилятор стал умнее определять реальные data races.
🔸 Более понятные ошибки: никаких загадочных сообщений о проблемах изоляции.
🔸 Естественный прогресс: начинаете с main actor, переходите на фоновые потоки только когда нужно.


Особенности работы:

🔹 В Swift 6 некоторые фичи включены по умолчанию.
🔹 Для Swift 5 нужно явное включение через настройки.
🔹 Пока есть некоторые баги (например, с CodingKey), но они исправляются.


💡 Вывод:

Approachable Concurrency — это большой шаг к тому, чтобы многозадачность в Swift стала более понятной и удобной для всех разработчиков.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1684🔥2🙏1👀1🫡1
👨‍💻 Отказ это не конец, а повод сменить тактику.

Получили шаблонное письмо с отказом? Первая реакция — разочарование и самокритика. Но в 80% случаев причина не в вас лично.


⚠️ Ключевые, не очевидные причины отказов:

🔸 Внутренний трансфер: вакансию создали под конкретного сотрудника.
🔸 Скрытый фриз: нанимают только senior-специалистов или приостановили найм.
🔸 Изменился портрет кандидата: ищут человека с опытом в другой индустрии.
🔸 Психологическая несовместимость: руководитель ощутил «не тот vibe».


Что скрывают рекрутеры:

🔸 Другой кандидат согласился на меньшую зарплату.
🔸 Вы были «запасным вариантом».
🔸 HR перегружен и не провел полноценный скрининг.
🔸 Вакансию закрыли из-за реорганизации.


Тактика действий после отказа:

🔹 Запросите конструктивный фидбек, спросите: «Какие конкретно навыки мне стоит прокачать?».
🔹 Сохраните контакт: добавьте HR в контакты LinkedIn или сохраните контакт в Telegram.
🔹 Предложите остаться в кадровом резерве: 37% компаний возвращаются к отказавшим кандидатам.
🔹 Проанализируйте этапы: если отказ после скрининга — работайте над резюме, после технического собеседования — над технические-скиллы.

Важный момент: создайте таблицу для отслеживания откликов с колонками:
🔹 Компания
🔹 Этап отказа
🔹 Полученный фидбек
🔹 Дата повторного контакта

Через 3 месяца напишите обновление: «Прошёл курс по X, добавил в портфолио Y. Хотел бы попробоваться на вашу позицию».

Помните:
🔸 Средний специалист получает 7 отказов перед оффером.
🔸 20% предложений поступают от компаний, которые ранее отказывали.
🔸 Каждый отказ это тренировка переговорных навыков.


💡 Вывод:

Не сжигайте мосты, мир IT тесен. Вежливость и профессиональное поведение после отказа часто вознаграждаются.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1985🔥2👀1🫡1
🔢 SwiftUI: защита конфиденциальных данных при скриншоте или записи экрана.

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

Основная идея заключается в использовании Secure TextField, который iOS автоматически размывает при попытке захвата экрана. Вот как это можно реализовать:


1️⃣ Создаем обертку SecureContentWrapper для скрытия контента:


struct SecureContentWrapper<Content: View>: UIViewRepresentable {
let content: Content

func makeUIView(context: Context) -> UIView {
let hostingController = UIHostingController(rootView: content)
let secureField = UITextField()
secureField.isSecureTextEntry = true
secureField.addSubview(hostingController.view)
return secureField
}

func updateUIView(_ uiView: UIView, context: Context) {}
}



2️⃣ Для удобства использования создаем модификатор:


struct ContentProtector: ViewModifier {
@State private var contentSize: CGSize = .zero

func body(content: Content) -> some View {
SecureContentWrapper(content: content)
.frame(width: contentSize.width, height: contentSize.height)
.background(
GeometryReader { proxy in
Color.clear
.preference(key: ContentSizePreference.self, value: proxy.size)
}
)
.onPreferenceChange(ContentSizePreference.self) { size in
self.contentSize = size
}
}
}

struct ContentSizePreference: PreferenceKey {
static var defaultValue: CGSize = .zero

static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
value = nextValue()
}
}



3️⃣ Добавляем расширение для View:


extension View {
func protectContent() -> some View {
self.modifier(ContentProtector())
}
}



♣️ Пример использования:


struct PrivateDataView: View {
var body: some View {
VStack {
Text("Номер карты: 1234 **** **** 5678")
.font(.title)

Text("Срок действия: 12/34")

Text("CVV: 123")
}
.padding()
.background(Color.gray.opacity(0.1))
.cornerRadius(12)
.protectContent()
}
}



⚠️ Важные моменты:

🔸 Защита работает только при активном захвате экрана.
🔸 Не предотвращает фотографирование экрана другим устройством.
🔸 Для максимальной безопасности комбинируйте с другими методами.


💡 Вывод:

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

Главное преимущество подхода: его простота и отсутствие необходимости в сложных вычислениях или дополнительных разрешениях.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2285🔥2🙏2🤝1🫡1
This media is not supported in the widget
VIEW IN TELEGRAM
17👍74🔥2🙏2
Добро пожаловать в мир Swift от Дена!

Хочешь быть в курсе самых свежих новостей, полезных советов и уникального контента? Тогда наш канал — именно то, что тебе нужно!

Что ты найдёшь в нашем канале:

Полезные статьи и новости из мира технологий и IT.
Уникальные видеоуроки и гайды по программированию.
Обсуждения актуальных тем с нашими подписчиками.
Развлекательный контент, который поможет расслабиться и отдохнуть!

Присоединись к нашему дружному сообществу и будь на шаг впереди! Подписывайся на Swift от Дена и открывай новые горизонты вместе с нами!

Не упустите шанс стать частью нашей команды!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12👀6🔥3😁3🗿3🤔1
🔨 Xcode 26 ускоряет сборки: появилось кеширование компиляции!

В Xcode 26 RC добавили ручное включение кеширования компиляции и это может серьезно ускорить вашу разработку.


⚠️ Как это работает?

Теперь можно закешировать результаты компиляции Swift и C-подобных языков. При повторной сборке тех же файлов Xcode будет брать их из кеша, а не пересобирать с нуля.


🔗 Xcode 26 RC Release Notes


👨‍💻 Мое мнение:

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


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
23👍1465🔥1👏1