Контроль и оптимизация процесса декодирования изображений в iOS
Каждый разработчик так или иначе сталкивается со сложностями при работе с изображениями. Кто-то пытается найти выход через сторонние фреймворки, но многие выбирают сложный путь и ищут подходящие API в доступных нам фреймворках.
Например, на выходных я в одном из своих проектов искал путь к оптимизации генерации кадров для длинных видео (спойлер, решил через длину шага в зависимости от длительности исходного видео и качества самих thumbnails).
Эффективная работа с изображениями стоит на трёх китах: на сколько мы грузим проц, эффективно ли используем оперативку и записи на устройство (кэшировании).
📖 В этой статье основное внимание уделяется использованию процессора, в частности, когда происходит фактический процесс декодирования, а также тому, в каком потоке и на каком этапе рендеринга это происходит.
Кроме очевидных советов на счёт переноса тяжёлой работы с основного потока и использования превьюх, можно почитать и про
😃 iOS Dev
Каждый разработчик так или иначе сталкивается со сложностями при работе с изображениями. Кто-то пытается найти выход через сторонние фреймворки, но многие выбирают сложный путь и ищут подходящие API в доступных нам фреймворках.
Например, на выходных я в одном из своих проектов искал путь к оптимизации генерации кадров для длинных видео (спойлер, решил через длину шага в зависимости от длительности исходного видео и качества самих thumbnails).
Эффективная работа с изображениями стоит на трёх китах: на сколько мы грузим проц, эффективно ли используем оперативку и записи на устройство (кэшировании).
📖 В этой статье основное внимание уделяется использованию процессора, в частности, когда происходит фактический процесс декодирования, а также тому, в каком потоке и на каком этапе рендеринга это происходит.
Кроме очевидных советов на счёт переноса тяжёлой работы с основного потока и использования превьюх, можно почитать и про
CVPixelBuffer
, и про полезные практики.Please open Telegram to view this post
VIEW IN TELEGRAM
9 15🔥12🤯8👍4❤🔥2💯2
Главный софтскилл
Прав ли тот, кто кричит громче всех?
С моей точки зрения, при обсуждении задач главное не доказать свою правоту, а найти общую истину.
Если в коллективе будет понимание этого принципа, то продукт будет развиваться, а коллективная эмпатия, если такой термин существует - будет только расти.
Часто в больших коллективах встречаются истории, когда два человека, а иногда и больше - настаивают только на своей точке зрения, будто бы она единственно верная, игнорируя доводы и конструктив.
Похожие истории могут встречаться не только в IT, но и в любых дебатах (политических, культурных, да и любых других тоже).
Отличие тех же каналов в телеге (или, например, хабра) от иных ресурсов, что многие авторы в СНГ своей путеводной звездой считают принизить остальных, найти проблемы, указать на ошибки (даже если их нет). Эту историю легко спроецировать и на обсуждения внутри коллективов, внутри вашей компании или стартапа.
При реализации каких-то крутых анимаций или забавных эффектов я всегда поддержу автора, потому что выйти из плоскости, найти необычное применение, понять как можно прокачать привычные вещи - не менее важно, чем наличие технической базы.
😃 iOS Dev
Прав ли тот, кто кричит громче всех?
С моей точки зрения, при обсуждении задач главное не доказать свою правоту, а найти общую истину.
Если в коллективе будет понимание этого принципа, то продукт будет развиваться, а коллективная эмпатия, если такой термин существует - будет только расти.
Часто в больших коллективах встречаются истории, когда два человека, а иногда и больше - настаивают только на своей точке зрения, будто бы она единственно верная, игнорируя доводы и конструктив.
Похожие истории могут встречаться не только в IT, но и в любых дебатах (политических, культурных, да и любых других тоже).
Отличие тех же каналов в телеге (или, например, хабра) от иных ресурсов, что многие авторы в СНГ своей путеводной звездой считают принизить остальных, найти проблемы, указать на ошибки (даже если их нет). Эту историю легко спроецировать и на обсуждения внутри коллективов, внутри вашей компании или стартапа.
При реализации каких-то крутых анимаций или забавных эффектов я всегда поддержу автора, потому что выйти из плоскости, найти необычное применение, понять как можно прокачать привычные вещи - не менее важно, чем наличие технической базы.
Навык общения не менее, а иногда и более важен, чем все ваши знания вместе взятые.
Please open Telegram to view this post
VIEW IN TELEGRAM
12❤🔥25🔥13💯12👍4 3✍1🏆1😎1 1
Как проверить, сколько памяти доступно приложению (и как увеличить этот лимит)
Пока все ищут способы снизить потребление памяти и оптимизируют приложение, вкручивая более производительные алгоритмы, тем временем Apple с 15 iOS добавили специальный entitlement.
С помощью этого разрешения можно сообщить, что некоторые основные фичи приложения могут работать лучше, если превысить стандартный лимит памяти приложения на поддерживаемых устройствах.
Кто-то его использовал?
📖 Кстати, чтобы проверить, сколько вообще доступно - можно чекнуть метод os_proc_available_memory (предварительно импортнув os).
😃 iOS Dev
Пока все ищут способы снизить потребление памяти и оптимизируют приложение, вкручивая более производительные алгоритмы, тем временем Apple с 15 iOS добавили специальный entitlement.
С помощью этого разрешения можно сообщить, что некоторые основные фичи приложения могут работать лучше, если превысить стандартный лимит памяти приложения на поддерживаемых устройствах.
Кто-то его использовал?
📖 Кстати, чтобы проверить, сколько вообще доступно - можно чекнуть метод os_proc_available_memory (предварительно импортнув os).
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥20 11🤯7✍2👍2⚡1🫡1
This media is not supported in your browser
VIEW IN TELEGRAM
Реализация шейдера с события Apple 9 сентября (Metal + SwiftUI)
Признаюсь, в этот раз было непросто, сначала думать идти через путь svg-path для яблока + последующая работа с кривыми, но в итоге остановился на чистой математике с отрисовкой в коде.
Также добавил эффект затухания в зависимости от временной метки и небольшой эффект морфинга с объектами.
На гифке используются жесты для управления позицией и все вышеперечисленное вместе.
✅ Конечно же, код уже доступен на бусти (там объясняю, как это можно реализовать у себя и настроить хоть радиус откуса 🍏, хоть эффект перехода для нашего heatmap, и на девайс можно накатить тоже, попробовать).
А ещё в трибьют-боте (условия приятнее).
😃 iOS Dev
Признаюсь, в этот раз было непросто, сначала думать идти через путь svg-path для яблока + последующая работа с кривыми, но в итоге остановился на чистой математике с отрисовкой в коде.
Также добавил эффект затухания в зависимости от временной метки и небольшой эффект морфинга с объектами.
На гифке используются жесты для управления позицией и все вышеперечисленное вместе.
А ещё в трибьют-боте (условия приятнее).
📖 А стартовые посты для изучения Metal: вот этот, этот и этот.
А вот тут, например, можно чекнуть как реализовать хитмап на шейдертое, без затухания и без временных меток, но как стартовая точка вполне подойдёт.
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥22 16❤🔥10 3⚡2👍2🤩2💯2
Как мигрировать UIKit-интерфейс на scene-based в iOS
Для iOS 18.4 и выше уже сейчас вы можете видеть сообщение в консоли для старых неадаптированных проектов:
А кто ставил бетку Xcode и пробовал собрать для 26 оси, наверняка видели и сообщения пострашнее:
В следующем за 26 осью мажорном релизе приложение, основанное не на сценах вообще не запустится.
Сейчас я работаю над большим проектом, в котором до сих пор не только многое на Objective-C, но и одна из задач в текущих релизах - заадоптить саппорт для CarPlay, так что здесь без корректного перехода на сцены ничего бы не получилось.
На самом деле всё довольно просто, для этоговам нужно всего лишь:
1. Добавляем саппорт сцен в plist:
2. Кроме этого, нужно задать конфиг для каждой из использующихся в проекте сцен:
3. И запилить метод willConnectTo:
Сама логика останется буквально той же, за небольшой поправкой, что ваш код из
Целиком разбор и советы от Apple можно посмотреть здесь (в TN3187).
😃 iOS Dev
Для iOS 18.4 и выше уже сейчас вы можете видеть сообщение в консоли для старых неадаптированных проектов:
This process does not adopt UIScene lifecycle.
This will become an assert in a future version.
А кто ставил бетку Xcode и пробовал собрать для 26 оси, наверняка видели и сообщения пострашнее:
UIScene lifecycle will soon be required.
Failure to adopt will result in an assert in the future.
В следующем за 26 осью мажорном релизе приложение, основанное не на сценах вообще не запустится.
Сейчас я работаю над большим проектом, в котором до сих пор не только многое на Objective-C, но и одна из задач в текущих релизах - заадоптить саппорт для CarPlay, так что здесь без корректного перехода на сцены ничего бы не получилось.
На самом деле всё довольно просто, для этого
1. Добавляем саппорт сцен в plist:
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
// Скорее всего, в небольших проектах достаточно будет одной сцены, но если у вас mac catalyst, например - то поддержка мультисцен буквально мастхэв для многих кейсов.
2. Кроме этого, нужно задать конфиг для каждой из использующихся в проекте сцен:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
configurationForConnecting connectingSceneSession: UISceneSession,
options: UIScene.ConnectionOptions
) -> UISceneConfiguration {
// Each UISceneConfiguration have a unique configuration name.
// The configuration name is a app-specific name
// you use to identify the scene, and it corresponds to entries
// in the `Info.plist` scene manifest.
var configurationName: String!
switch options.userActivities.first?.activityType {
case UserActivity.GalleryOpenInspectorActivityType:
// Create a photo inspector window scene.
configurationName = "Inspector Configuration"
default:
// Create a default gallery window scene.
configurationName = "Default Configuration"
}
return UISceneConfiguration(
name: configurationName,
sessionRole: connectingSceneSession.role
)
}
}
3. И запилить метод willConnectTo:
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
// Confirm the scene is a window scene in iOS or iPadOS.
guard let windowScene = scene as? UIWindowScene else { return }
window = UIWindow(windowScene: windowScene)
window?.rootViewController = YourRootViewController()
window?.makeKeyAndVisible()
}
}
Сама логика останется буквально той же, за небольшой поправкой, что ваш код из
applicationDidBecomeActive(_:)
надо перенести в sceneDidBecomeActive(_:)
, и так далее.Целиком разбор и советы от Apple можно посмотреть здесь (в TN3187).
Please open Telegram to view this post
VIEW IN TELEGRAM
8 24💯9👏6🔥5✍2❤🔥2 2👍1🤯1🫡1
У меня отличная новость! Открываю бета-тестирование бота по iOS.
Есть несколько режимов, бесконечный и режим собеса. И реализована таблица лидеров (не переживайте, ваши результаты для всех анонимны).
Реализовал на firestore+cloud functions+telegram bot api на node.js.
Сейчас крутится один инстанс, посмотрю как будет по нагрузке в дальнейшем.
Для трибьюта и телеги я реализовал кроссчек подписок (бусти по чату) и выкатил бонусный премиум-режим.
Не забудьте подписаться и вы
Ах да, специальный бонус тому, кто наберёт больше всех очков в конце недели: будет пасхалка от меня в буквальном смысле.
🎁 Поддержать разработку.
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥32 12❤🔥10👍6 2
Four Corners: первая игра, целиком написанная на Swift для Playdate
В канале я часто пишу про необычные решения, а ещё немного коллекционирую самые разные игровые приставки (ха-ха, про это можно было даже написать в посте про Японию).
Например, из последней поездки притащил Game Boy Micro Anniversary Edition, пусть и немного потрёпанную временем).
Одна из приставок в коллекции - Playdate (и она как раз на фотке к этому посту).
И для неё с недавних пор можно писать на Swift!
Нашёл интересное интервью со Стивеном Чипманом, который рассказало плюсах о всей боли, которая сопутствовало процессу переписывания приложения с Lua.
Например, недоступен Foundation, а ещё нет Codable, что превратило работу с JSON в нетривиальный таск.
Особое внимание пришлось на процесс отладки. Например, в рантайме если приложение крашится - то мы не можем даже получить стектрейс.
📖 В общем, рекомендую почитать, особенно если вам интересен и embedded swift, в частности.
📺 А тут можно посмотреть и доклад на тему.
😃 iOS Dev
В канале я часто пишу про необычные решения, а ещё немного коллекционирую самые разные игровые приставки (ха-ха, про это можно было даже написать в посте про Японию).
Например, из последней поездки притащил Game Boy Micro Anniversary Edition, пусть и немного потрёпанную временем).
Одна из приставок в коллекции - Playdate (и она как раз на фотке к этому посту).
И для неё с недавних пор можно писать на Swift!
Нашёл интересное интервью со Стивеном Чипманом, который рассказал
Например, недоступен Foundation, а ещё нет Codable, что превратило работу с JSON в нетривиальный таск.
Особое внимание пришлось на процесс отладки. Например, в рантайме если приложение крашится - то мы не можем даже получить стектрейс.
📖 В общем, рекомендую почитать, особенно если вам интересен и embedded swift, в частности.
📺 А тут можно посмотреть и доклад на тему.
Please open Telegram to view this post
VIEW IN TELEGRAM
15❤🔥14👍11 7🔥3 3🍓2
This media is not supported in your browser
VIEW IN TELEGRAM
А вы знали, что системный UIDatePicker (даже в напоминаниях и часах) - на самом деле не бесконечная лента?
Иногда в работе всем приходится решать баги, прилетающие от отдела QA, которые встречаются у пары пользователей или при определённой фазе Луны.
Что делает в таком случае Apple?
Ответ - решают проблемы остальных 99.99% пользователей.
Да и вообще это что, в первый раз?
😃 iOS Dev
Иногда в работе всем приходится решать баги, прилетающие от отдела QA, которые встречаются у пары пользователей или при определённой фазе Луны.
Что делает в таком случае Apple?
Ответ - решают проблемы остальных 99.99% пользователей.
Да и вообще это что, в первый раз?
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥35🤯12 9👍6🆒3 3⚡1🎉1💯1🏆1
This media is not supported in your browser
VIEW IN TELEGRAM
5😁42🤣22🔥6🫡4 2👍1🤩1🤝1 1
Что там по Swift Concurrency да и вообще по целям?
Или как говорится, у меня была какая-то практика, и я её придерживался.
За последнее время я как и прежде, продолжаю регулярно обновлять приложение, наполнять вопросами (из проверенных источников и рабочих кейсов, а не из аи-слопа, которым наводнено к сожалению множество каналов, и, к сожалению - хабра и медиума).
Кстати, совсем скоро выйдет и новая версия приложения, которое в бете уже месяц.
Сделал карту изучения Swift Concurrency, опубликовал сайт, продолжаю наполнять базу качественным контентом сразу по нескольким направлениям, которые непосредственно связаны с рабочими задачами.
🤖 Ботом воспользовалось уже около тысячи человек, и вот первые выводы.
Кайф, что все работает стабильно, все метрики в норме, ожидал проблем. В комментарии канала написали несколько десятков человек с конструктивными предложениями и это здорово (пишите и вы)!
Подпишитесь💰 на бусти и ⭐️ прямо здесь и получите доступ к эсклюзивному и качественному контенту.
✅ С вас подписка по специальному офферу - с меня все нижеперечисленное (и даже больше).
😃 iOS Dev
Или как говорится, у меня была какая-то практика, и я её придерживался.
За последнее время я как и прежде, продолжаю регулярно обновлять приложение, наполнять вопросами (из проверенных источников и рабочих кейсов, а не из аи-слопа, которым наводнено к сожалению множество каналов, и, к сожалению - хабра и медиума).
Кстати, совсем скоро выйдет и новая версия приложения, которое в бете уже месяц.
Сделал карту изучения Swift Concurrency, опубликовал сайт, продолжаю наполнять базу качественным контентом сразу по нескольким направлениям, которые непосредственно связаны с рабочими задачами.
Кайф, что все работает стабильно, все метрики в норме, ожидал проблем. В комментарии канала написали несколько десятков человек с конструктивными предложениями и это здорово (пишите и вы)!
Подпишитесь
Что можно получить сегодня?➡️ Несколько десятков пройденных алгоритмических задач с боевых конкурсов.➡️ Вопросы на чтение кода➡️ Многопоточность➡️ DispatchQueue: практические вопросы (две части)➡️ Swift Concurrency➡️ Память: ARC, side table, флаги, утечки➡️ UIKit (теория + практика, две части)➡️ Компилятор Swift➡️ Основы: URLSession, UICollectionView и многое другое.
А также:➡️ Множество необычных подходов к анимации (включая шейдеры).➡️ Разбор популярных архитектур (и их недостатков).➡️ Несколько кайфовых и интересных фактов об истории прототипирования в Apple.➡️ Как на самом деле работает Code Signing.➡️ Несколько трюков и фишек при работе c Xcode.
Please open Telegram to view this post
VIEW IN TELEGRAM
11 15🔥10👏5👍2🍓2 1
SwiftUI WebView: настройка, навигация, кастомные схемы
На WWDC 2025 был анонсирован WebView для SwiftUI, но код из видео не работал, более того, он даже не компилился.
📖 В этой статье можно посмотреть на основные аспекты работы, пример навигации и работу с JavaScript-функциями.
🛠 Код проекта доступен и на GitHub.
😃 iOS Dev
На WWDC 2025 был анонсирован WebView для SwiftUI, но код из видео не работал, более того, он даже не компилился.
📖 В этой статье можно посмотреть на основные аспекты работы, пример навигации и работу с JavaScript-функциями.
🛠 Код проекта доступен и на GitHub.
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥15 12👍7✍4👏2💯1🏆1
Что нового в Swift 6.2 (помимо обновлений, связанных с параллелизмом)
📺 Неплохой разбор нововведений, которые появятся в iOS 26 и Xcode 26.
И хотя основное внимание все уделяют concurrency, есть и много других фич, о которых можно узнать.
Среди разобранных пропозалов:
➡️ Default Value in String Interpolations
➡️ Raw identifiers
➡️ Collection conformances for enumerated()
➡️ InlineArray, a fixed-size array
➡️ InlineArray Type Sugar
➡️ Integer Generic Parameters
➡️ Span: Safe Access to Contiguous Storage
😃 iOS Dev
📺 Неплохой разбор нововведений, которые появятся в iOS 26 и Xcode 26.
И хотя основное внимание все уделяют concurrency, есть и много других фич, о которых можно узнать.
Среди разобранных пропозалов:
Please open Telegram to view this post
VIEW IN TELEGRAM
5 11👍8🔥7❤🔥3👏2🎉1🏆1