Inspect & optimize Image Decoding timing in iOS
⌛ Декодирование изображений в iOS происходит в основном потоке во время фазы коммита
⚙️ Используйте методы UIKit, такие как
➡️ Старайтесь использовать
⚠️ Использование API
Core Animation
, что может вызывать зависания приложения при работе с большими изображениями.prepareForDisplay
и prepareThumbnail
, для предварительной обработки изображений в фоновом режиме, чтобы избежать задержек в основном потоке.ImageIO
для создания уменьшенных изображений перед дальнейшей обработкой и избегайте копирования изображений между основной и графической памятью для повышения производительности.UIImageReader
в iOS 17 может привести к утечкам памяти, которые были исправлены в iOS 18.Getting HDR UIImage in iOS 17 and display it in a UIImageView will result in major memory leak internally. Apple have fixed this issue on iOS 18
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2
High Level Anatomy of a Camera Capturing Session
❓ Камера или микрофон служат источником для захвата видео, фото или аудио, включая заднюю и фронтальную камеры.
ℹ️ Выход может быть в виде фото или видео, которые сохраняются на диске или обрабатываются для распознавания лиц и применения фильтров.
➡️
❓ Метод
➡️
AVCaptureSession
является центральным контроллером, который управляет входами, выходами и предварительными слоями для захвата медиа.capturePhoto
асинхронный, что означает, что захват фото занимает время из-за фокусировки и экспозиции.AVCapturePhoto
- это необработанный вывод, PHAsset
- ссылка на изображение в библиотеке, CGImage
- это битовая карта, а Image
в SwiftUI
- визуальное представление.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Certificate Pinning on iOS in Practice
Статья про то, что такое
⚠️ Основная цель реализации
🖥 Certificate pining включает в себя проверку цепочки сертификатов, состоящей из корневого, промежуточного и конечного сертификатов, с акцентом на конечный сертификат для обеспечения безопасности соединения.
ℹ️ Можно пиннить как весь сертификат, так и его отпечаток или открытый ключ, что дает гибкость в управлении сертификатами, особенно при их обновлении.
❗️ Обновление сертификатов может быть неудобным, так как требует обновления приложения. Рекомендуется использовать пиннинг открытого ключа или удаленные обновления сертификатов через такие решения, как
⚙️ Для реализации
Статья про то, что такое
certificate pining
и как его настроить.certificate pining
— защита от атак типа человек посередине
, которые могут позволить злоумышленникам перехватывать данные пользователей и тестировать уязвимости API.CloudKit
.certificate pining
в iOS необходимо использовать URLSessionDelegate
для обработки аутентификационных вызовов и проверки доверенных сертификатов.Please open Telegram to view this post
VIEW IN TELEGRAM
Swift Computed Property: Code Examples
Вдруг вы не знаете, что такое вычисляемое свойство - эта статья для вас🙂
ℹ️ Вычисляемое свойство в Swift предоставляет геттер и необязательный сеттер для косвенного доступа к другим свойствам и значениям, позволяя создавать новые значения на основе существующих.
❓
⚠️ Вычисляемые свойства выполняют свои операции каждый раз при доступе, что может привести к снижению производительности при тяжелых вычислениях. Рекомендуется использовать сохраненные значения, если вычисления статичны.
➡️
Такие свойства не принимают аргументы, поэтому для логики, требующей динамических входных параметров или тяжелых вычислений, лучше использовать методы для повышения читаемости и управления производительностью.
❓ Вычисляемые свойства могут иметь асинхронные геттеры, позволяя использовать
Вдруг вы не знаете, что такое вычисляемое свойство - эта статья для вас
Computed properties
могут использоваться для создания значений, таких как имя файла, основанное на других свойствах, или для управления доступом к внутренним объектам через публичные интерфейсы.Такие свойства не принимают аргументы, поэтому для логики, требующей динамических входных параметров или тяжелых вычислений, лучше использовать методы для повышения читаемости и управления производительностью.
await
для выполнения операций, таких как валидация данных перед возвратом значения.struct Content {
enum ContentError: Error {
case emptyFileExtension
}
let name: String
let fileExtension: String
/// A computed property to generate a filename.
/// Throws an error when the file extension is empty.
var filename: String {
get throws(ContentError) {
guard !fileExtension.isEmpty else {
throw .emptyFileExtension
}
return name + "." + fileExtension
}
}
}
/// We now need to use the `try` keyword when accessing:
print(try content.filename) // Prints: "swiftlee-banner.png"
Please open Telegram to view this post
VIEW IN TELEGRAM