Optimize CPU performance with Instruments
😮 Супер полезная сессия про оптимизации CPU. Тут и про то, как работает пайплан CPU, как устроена память и кеш в процессоре, а также про то, как это профилировать с помощью инструментов. Очень много полезного.
Вот пару моментов:
⚠️ Используйте
✔️ Новый инструмент
🔥 Инструмент
🔍 В сессии оптимизировали бинарный поиск - от начальной имплементации получилось ускорить в 25 раз. Однако, стоит всегда находить баланс - код становится сложным и трудным к пониманию, не говоря уже о том, что на такие оптимизации может уйти очень много времени.
#wwdc2025
Вот пару моментов:
CPU Profiler для точных замеров использования процессора - замеры проводятся независимо базируясь на тактовой частоте, в то время как Time Profiler делает общий замер. Processor Trace позволяет записывать все инструкции, выполняемые приложением, с минимальным влиянием на производительность, что помогает точно выявлять узкие места.CPU Counters помогает выявлять узкие места в производительности, анализируя события в каждом блоке CPU и предоставляя данные о производительности.#wwdc2025
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4❤1
Read documents using the Vision framework
Что нового в Vision фреймворке?
🔥 Новый режим распознавания документов в виде таблиц! API
😮 Функция
➡️ Новая модель определения позы руки более компактна и точна, но требует переобучения существующих классификаторов из-за изменения расположения суставов.
#wwdc2025
Что нового в Vision фреймворке?
RecognizeDocumentsRequest позволяет извлекать структурированную информацию из документов, включая таблицы, списки и машинно-читаемые коды, что упрощает процесс обработки данных.DetectLensSmudgeRequest определяет, было ли изображение снято с запачканным объективом, используя коэффициент уверенности от 0 до 1, что помогает фильтровать низкокачественные изображения.#wwdc2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Android Workgroup
Swift идет в Android🫠
⚡️ Основная цель Android workgroup заключается в добавлении и поддержке Android как официально поддерживаемой платформы для языка Swift. Иными словами можно будет пилить приложения под андроид из Swift.
➡️ Членство в группе открыто для всех желающих, и участники могут общаться через регулярные видеозвонки и форумы Swift.
➡️ Все желающие могут участвовать в обсуждениях, задавать вопросы, сообщать об ошибках и отправлять запросы на изменения в проектах поддержки Android.
А вы что думаете? Идет нормальная замена KMP?🙂
Swift идет в Android
А вы что думаете? Идет нормальная замена KMP?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16
Subtle retain cycle is subtle
Отойдем немного от презентации эпл к насущным проблемам. А именно к🔍
➡️ Измените область видимости сильной ссылки, переместив
➡️ Используйте слабую ссылку на
❗️ Использование
Отойдем немного от презентации эпл к насущным проблемам. А именно к
Retain Cycle.
Retain cycle сложно отследить, и в приведенном примере класс Example создает цикл удержания, который не позволяет deinit выполниться.class Example {
var task: Task<Void, Never>?
init() {
task = Task { [weak self] in
guard let self else { return }
repeat {
performSomeWork()
} while !Task.isCancelled
}
}
func performSomeWork() { }
deinit {
print("deinit")
task?.cancel()
}
}
Автор предлагает несколько решений: guard внутрь цикла repeat, чтобы избежать удержания объекта Example.task = Task { [weak self] in //
repeat { //
guard let self else { return } // - strong reference taken here
performSomeWork() //
} while !Task.isCancelled // - goes out of scope here
}
self в методе performSomeWork, чтобы избежать создания retain cycle.task = Task { [weak self] in
repeat {
self?.performSomeWork()
} while !Task.isCancelled
}capture group может не решить проблему, так как методы экземпляра имеют неявную ссылку на self.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
What’s new in UIKit
🆕
ℹ️ В iOS 26 представлен новый дизайн с материалом
✏️
➡️
➡️ Введен новый метод
#wwdc2025
UIKit теперь поддерживает автоматическое отслеживание Observable объектов, что упрощает синхронизацию пользовательского интерфейса без необходимости вручную вызывать setNeedsLayout.Liquid Glass, который обновляет стандартные компоненты UIKit и улучшает навигационные переходы.UIKit теперь позволяет интегрировать сцены SwiftUI с помощью нового протокола UIHostingSceneDelegate, что упрощает совместное использование UIKit и SwiftUI в приложениях.UIKit расширяет поддержку HDR, позволяя создавать HDR цвета и использовать их в UIColorPickerViewController, что улучшает визуальные эффекты в приложениях.updateProperties для UIView и UIViewController, который позволяет более эффективно обновлять свойства без лишних проходов по макету.#wwdc2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Automatic Observation Tracking in UIKit and AppKit: The Feature Apple Forgot to Mention
А вот и обзор изменений для обновления UI.
🔴 В iOS 18 и macOS 15 добавлено автоматическое отслеживание изменений для
👀 Чтобы активировать автоматическое отслеживание, необходимо добавить ключ
❓ Автоматическое отслеживание работает в методах, таких как
☄️ В iOS 26 добавлены новые методы, такие как
⚠️ Важно учитывать, что отслеживание происходит только в определенных методах, и необходимо следить за безопасностью потоков и возможными утечками памяти.
А вот и обзор изменений для обновления UI.
UIKit и AppKit, позволяющее обновлять интерфейс без ручных вызовов методов, таких как setNeedsDisplay().UIObservationTrackingEnabled в Info.plist для UIKit и NSObservationTrackingEnabled для AppKit.viewWillLayoutSubviews() и layoutSubviews(), что упрощает синхронизацию данных и интерфейса.updateProperties(), которые обеспечивают более эффективное обновление свойств перед layoutSubviews, улучшая производительность.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Profile and optimize power usage in your app
☄️ Очень крутая сессия про профилирование использования батареи приложением - вся функциональность блекнет на фоне быстро садящегося телефона.
🆕 Используйте
📊 При разработке новых функций сравнивайте влияние различных реализаций на энергопотребление, проводя тесты в разных условиях и усредняя результаты.
⚠️ Включите режим разработчика и
⚙️ Используйте инструменты
#wwdc2025
Power Profiler в Instruments для выявления и устранения проблем с энергопотреблением в приложениях, что позволяет улучшить время работы от батареи.Performance Trace на устройстве, чтобы собирать данные о потреблении энергии в реальных условиях, что помогает выявить проблемы, которые невозможно воспроизвести в процессе разработки.Xcode, такие как Energy Gauges, XCTest и MetricKit, для мониторинга и оптимизации энергопотребления на всех этапах разработки и после выпуска приложения.#wwdc2025
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2
Schedule a countdown timer with AlarmKit
Не стал делать обзор
❓ Он позволяет планировать одноразовые будильники, повторяющиеся будильники и таймеры обратного отсчета, которые работают даже в беззвучном режиме.
⚠️ Перед использованием
⌛ Для настройки таймера необходимо создать объект
🔴 Для отображения текущего обратного отсчета во время работы таймера необходимо настроить
🖥
Не стал делать обзор
AlarmKit из видео сессии, но сразу принес статью с кучей примеров.AlarmKit необходимо запросить у пользователя разрешение, добавив ключ NSAlarmKitUsageDescription в Info.plist и проверив статус авторизации с помощью API AlarmManager.AlarmPresentation.Alert с заголовком и кнопкой остановки, а затем использовать AlarmAttributes для определения его атрибутов перед вызовом метода schedule() AlarmManager.Live Activity, добавив Widget Extension и используя ActivityConfiguration для отображения состояния таймера на экране блокировки и в Dynamic Island.AlarmKit предоставляет асинхронную последовательность для получения всех активных будильников, что позволяет отображать их в приложении и управлять ими, включая возможность отмены.struct TimerButton: View {
private let manager = AlarmManager.shared
var body: some View {
Button("Start a timer", systemImage: "timer") {
Task {
if await checkForAuthorization() {
await scheduleTimer()
} else {
// Handle unauthorized status
}
}
}
}
private func scheduleTimer() async {
let alert = AlarmPresentation.Alert(
title: "Ready!",
stopButton: AlarmButton(
text: "Done",
textColor: .pink,
systemImageName: "checkmark"
)
)
}
...
}Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4