Лёгкий способ определить доминирующий язык в исходном тексте
Или как подкинуть идею сделать приложение для полиглотов в качестве пет-проекта
Для фреймворка
С помощью
💡 Чтобы сгенерировать несколько возможных прогнозов, используйте метод
One more thing
Хотя этот шаг не обязателен, вы можете предоставить информацию о тексте, который хотите идентифицировать, если вы уже что-то о нем знаете.
Например, если вы знаете, что язык должен входить в определенный набор языков, вы можете указать это ограничение.
@iOS Dev — is it some reebok or some nike?
Или как подкинуть идею сделать приложение для полиглотов в качестве пет-проекта
Для фреймворка
Natural Language
эту задачу выполняет NLLanguageRecognizer
. С помощью
NLLanguageRecognizer
вы можете получить наиболее вероятный язык для фрагмента входного текста или набор возможных языков-кандидатов со связанными с ними вероятностями. 💡 Чтобы сгенерировать несколько возможных прогнозов, используйте метод
languageHypotheses(withMaximum:)
.One more thing
Хотя этот шаг не обязателен, вы можете предоставить информацию о тексте, который хотите идентифицировать, если вы уже что-то о нем знаете.
Например, если вы знаете, что язык должен входить в определенный набор языков, вы можете указать это ограничение.
recognizer.languageConstraints = [.french, .russian, .german, .italian]
recognizer.languageHints = [.french: 0.5,
.russian: 0.9,
.german: 0.8,
.italian: 0.6]
let constrainedHypotheses = recognizer.languageHypotheses(withMaximum: 2)
print(constrainedHypotheses)
@iOS Dev — is it some reebok or some nike?
Реализация и тестирование фичи Shared with You в iOS 16
В iOS 16 появилась функция Shared with You, позволяющая демонстрировать контент, которым поделились в Messages, внутри вашего приложения.
Пользователи смогут найти контент, который они могли бы потерять в длинной переписке. Такие приложения, как Photos, Music и Podcasts, уже реализовали поддержку, теперь пришло время добавить ее в ваши приложения.
Shared with You сопоставляет контент, которым поделились с URL на основе универсальных ссылок.
📖 В статье об этом говорится более подробно, рассматривается реализация, тестирование и то, когда можно ожидать появления общих URL-адресов.
@iOS Dev
В iOS 16 появилась функция Shared with You, позволяющая демонстрировать контент, которым поделились в Messages, внутри вашего приложения.
Пользователи смогут найти контент, который они могли бы потерять в длинной переписке. Такие приложения, как Photos, Music и Podcasts, уже реализовали поддержку, теперь пришло время добавить ее в ваши приложения.
Shared with You сопоставляет контент, которым поделились с URL на основе универсальных ссылок.
📖 В статье об этом говорится более подробно, рассматривается реализация, тестирование и то, когда можно ожидать появления общих URL-адресов.
@iOS Dev
Потокобезопасность (Thread Safety) в Swift
💡 Параллелизм — это точка входа для самых сложных и причудливых ошибок, с которыми когда-либо сталкивался программист.
Поскольку на уровне приложения мы не имеем реального контроля над потоками и оборудованием, не существует идеального способа создания модульных тестов, гарантирующих правильное поведение ваших систем при одновременном использовании нескольких потоков.
Однако мы можем сделать несколько обоснованных предположений.
📖 В этой статье автор рассказывает, что такое потокобезопасность, какие инструменты iOS предоставляет для ее достижения и как они сравниваются с точки зрения производительности.
@iOS Dev
💡 Параллелизм — это точка входа для самых сложных и причудливых ошибок, с которыми когда-либо сталкивался программист.
Поскольку на уровне приложения мы не имеем реального контроля над потоками и оборудованием, не существует идеального способа создания модульных тестов, гарантирующих правильное поведение ваших систем при одновременном использовании нескольких потоков.
Однако мы можем сделать несколько обоснованных предположений.
📖 В этой статье автор рассказывает, что такое потокобезопасность, какие инструменты iOS предоставляет для ее достижения и как они сравниваются с точки зрения производительности.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Как временно скрыть экран вашего приложения
Научитесь скрывать конфиденциальную информацию при переключении приложений.
📖 В этом коротком руководстве рассматривается, как временно перекрыть весь экран вашего приложения кастомным UIView.
В целом это решение имеет два основных варианта использования:
1️⃣ Затемнение фона для отображения всплывающего контента (речь про pop-over).
2️⃣ Скрытие контента при переключении между приложениями. Может пригодиться, чтобы скрыть потенциально конфиденциальную инфу или просто показать пользователю что-то любопытное.
Оба кейса по факту работают одинаково, но код для отображения и скрытия вьюх отличается.
@iOS Dev
Научитесь скрывать конфиденциальную информацию при переключении приложений.
📖 В этом коротком руководстве рассматривается, как временно перекрыть весь экран вашего приложения кастомным UIView.
В целом это решение имеет два основных варианта использования:
1️⃣ Затемнение фона для отображения всплывающего контента (речь про pop-over).
2️⃣ Скрытие контента при переключении между приложениями. Может пригодиться, чтобы скрыть потенциально конфиденциальную инфу или просто показать пользователю что-то любопытное.
Оба кейса по факту работают одинаково, но код для отображения и скрытия вьюх отличается.
@iOS Dev
Почему ваша картинка размером в 2 мегабайта может отъедать 80 мб памяти? Сейчас разберёмся.
Или как пофиксить одну из причин out of memory exception
На собеседованиях часто просят отобразить ленту из картинок, взятых откуда-нибудь из стороннего ресурса, гугла, например, условного unsplash или откуда-нибудь ещё. Скорее всего, и у инженеров на боевых проектах рано или поздно может возникнуть подобная задача.
Одна из потенциальных сложностей, с которой можно столкнуться при такой задаче —
Использование памяти нашим приложением резко возрастает, когда мы начинаем показывать HD-изображения на экране (даже одно уже может внести существенный импакт для увеличения используемой памяти).
Главное, что нужно запомнить, использование памяти ≠ размеру файла. И вот почему.
Использование памяти связано с размерами изображения, а не с размером файла (Session 416, WWDC 2018).
Всё дело в том, что для отображения изображения на экране, iOS сначала необходимо декодировать и распаковать изображение. Обычно 1 пиксель декодированного изображения занимает 4 байта памяти — 1 байт для красного, 1 байт для зеленого, 1 байт для синего и 1 байт для альфа-канала (да-да, тот самый RGB с альфой). Например:
И именно это значение и будет отображаться, когда мы будем чекать, что же происходит в приложении.
Что со всем этим делать?
Разработчики в этой статье пробовали менять масштаб и перерисовать изображение, но это не помогло. Это связано с тем, что операции для изменения размера для
Одно из решений, которым делятся инженеры Apple — юзать даунсэмплинг.
Мы можем использовать
Флаги, которые можно использовать
1️⃣
В ситуации, когда у вас нет доступа к пути к источнику изображения, вы можете создать объект CGImageSource, используя инициализатор CGImageSourceCreateWithData().
2️⃣
3️⃣
Подводные камни (а как же без них)
Имейте в виду, что даунсэмплинг — это процесс, который потребляет ресурсы процессора. Таким образом, по-прежнему предпочтительнее использовать правильно масштабированный источник изображения, а не понижать дискретизацию HD-изображения. Другими словами, вы должны использовать даунсэмплинг только тогда, когда вам нужно отобразить изображение, размер которого намного превышает требуемый размер на экране.
Важные моменты
⚪ Помните, что память — это конечный и общий ресурс.
⚪ Используйте встроенный в Xcode мониторинг.
⚪ Позвольте iOS выбрать ваши форматы изображений, когда это возможно.
⚪ Используйте ImageIO для понижения разрешения изображений (помните про подводные камни).
⚪ Выгружайте крупные ресурсы, которые находятся за пределами экрана.
⚪ Не игнорируйте графики памяти (memory graphs), чтобы лучше понять, что происходит.
Что почитать ещё?
📖 Deep Dive into iOS Memory.
📖 Reducing Memory Footprint When Using UIImage.
📺 Session 416, WWDC 2018.
🔗 https://developer.apple.com/documentation/imageio/cgimagesource.
@iOS Dev — отвечаем на вопросы.
Или как пофиксить одну из причин out of memory exception
На собеседованиях часто просят отобразить ленту из картинок, взятых откуда-нибудь из стороннего ресурса, гугла, например, условного unsplash или откуда-нибудь ещё. Скорее всего, и у инженеров на боевых проектах рано или поздно может возникнуть подобная задача.
Одна из потенциальных сложностей, с которой можно столкнуться при такой задаче —
out of memory exception
. Так в чём же дело?Использование памяти нашим приложением резко возрастает, когда мы начинаем показывать HD-изображения на экране (даже одно уже может внести существенный импакт для увеличения используемой памяти).
Главное, что нужно запомнить, использование памяти ≠ размеру файла. И вот почему.
Использование памяти связано с размерами изображения, а не с размером файла (Session 416, WWDC 2018).
Всё дело в том, что для отображения изображения на экране, iOS сначала необходимо декодировать и распаковать изображение. Обычно 1 пиксель декодированного изображения занимает 4 байта памяти — 1 байт для красного, 1 байт для зеленого, 1 байт для синего и 1 байт для альфа-канала (да-да, тот самый RGB с альфой). Например:
(3648 * 5472) * 4 bytes ≈ 80MB
И именно это значение и будет отображаться, когда мы будем чекать, что же происходит в приложении.
Что со всем этим делать?
Разработчики в этой статье пробовали менять масштаб и перерисовать изображение, но это не помогло. Это связано с тем, что операции для изменения размера для
UIImage
дороги. В процессе изменения размера iOS по-прежнему будет декодировать и распаковывать исходное изображение, вызывая нежелательный скачок памяти.Одно из решений, которым делятся инженеры Apple — юзать даунсэмплинг.
Мы можем использовать
ImageIO
для изменения размера изображения перед его отображением на экране. По факту, для нас это выльется только в стоимости ресайзинга исходной картинки. Вот здесь можно чекнуть сниппет.Флаги, которые можно использовать
1️⃣
kCGImageSourceShouldCache
— когда для этого флага установлено значение false
, мы сообщаем основному фреймворку, что нам нужно только создать ссылку на источник изображения и не хотим декодировать изображение сразу при создании объекта CGImageSource
.В ситуации, когда у вас нет доступа к пути к источнику изображения, вы можете создать объект CGImageSource, используя инициализатор CGImageSourceCreateWithData().
2️⃣
kCGImageSourceShouldCacheImmediately
— этот флаг указывает, что декодировать изображение нужно именно в тот момент, когда мы запускаем процесс понижения дискретизации.3️⃣
kCGImageSourceCreateThumbnailWithTransform
— установка этого флага в значение true
очень важно для сохранения исходной ориентации.Подводные камни (а как же без них)
Имейте в виду, что даунсэмплинг — это процесс, который потребляет ресурсы процессора. Таким образом, по-прежнему предпочтительнее использовать правильно масштабированный источник изображения, а не понижать дискретизацию HD-изображения. Другими словами, вы должны использовать даунсэмплинг только тогда, когда вам нужно отобразить изображение, размер которого намного превышает требуемый размер на экране.
Важные моменты
⚪ Помните, что память — это конечный и общий ресурс.
⚪ Используйте встроенный в Xcode мониторинг.
⚪ Позвольте iOS выбрать ваши форматы изображений, когда это возможно.
⚪ Используйте ImageIO для понижения разрешения изображений (помните про подводные камни).
⚪ Выгружайте крупные ресурсы, которые находятся за пределами экрана.
⚪ Не игнорируйте графики памяти (memory graphs), чтобы лучше понять, что происходит.
Что почитать ещё?
📖 Deep Dive into iOS Memory.
📖 Reducing Memory Footprint When Using UIImage.
📺 Session 416, WWDC 2018.
🔗 https://developer.apple.com/documentation/imageio/cgimagesource.
@iOS Dev — отвечаем на вопросы.
Apple Developer
iOS Memory Deep Dive - WWDC18 - Videos - Apple Developer
Discover how memory graphs can be used to get a close up look at what is contributing to an app's memory footprint. Understand the true...
Background Modes в Swift: терминология, настройка и пример приложения
Apple начала разрешать приложениям выполнять работу в фоновом режиме в далёком 2010 году с выходом iOS 4 и с тех пор развивала и улучшала фоновые режимы.
Но всё не так просто, iOS ограничивает использование фоновых операций для улучшения пользовательского опыта и продления срока службы батареи.
Если ваша задача не входит ни в одну из разрешенных категорий, вы можете столкнуться с реджектом в App Store при попытке обмануть систему, используя фоновые режимы, которые для ваших задач не предназначены. Считайте, что вы предупреждены!
📖 В этом руководстве вы узнаете о четырех вещах, которые ваши приложения могут выполнять в фоне:
1️⃣ Воспроизведение аудио.
2️⃣ Получение обновлений местоположения.
3️⃣ Выполнение критических задач фиксированной продолжительности.
4️⃣ Фоновая загрузка: выполнение фоновых обновлений по расписанию, определяемому iOS.
@iOS Dev
Apple начала разрешать приложениям выполнять работу в фоновом режиме в далёком 2010 году с выходом iOS 4 и с тех пор развивала и улучшала фоновые режимы.
Но всё не так просто, iOS ограничивает использование фоновых операций для улучшения пользовательского опыта и продления срока службы батареи.
Если ваша задача не входит ни в одну из разрешенных категорий, вы можете столкнуться с реджектом в App Store при попытке обмануть систему, используя фоновые режимы, которые для ваших задач не предназначены. Считайте, что вы предупреждены!
📖 В этом руководстве вы узнаете о четырех вещах, которые ваши приложения могут выполнять в фоне:
1️⃣ Воспроизведение аудио.
2️⃣ Получение обновлений местоположения.
3️⃣ Выполнение критических задач фиксированной продолжительности.
4️⃣ Фоновая загрузка: выполнение фоновых обновлений по расписанию, определяемому iOS.
@iOS Dev
Знаете ли вы, что такое UUID на самом деле или при чём тут RFC 4122?
В документации Apple сказано, что UUID это универсальное уникальное значение для идентификации типов, интерфейсов и других элементов. Но что, если я скажу вам, что оно не такое уж уникальное?
Шанс сгенерировать один и тот же идентификатор дважды на любом устройстве планеты практически равен нулю! Ключевое слово здесь — практически, и ниже я попытаюсь рассказать, почему.
В Swift мы можем создать
Результатом будут 128 случайно сгенерированных битов (если вы хотите вывести значение строки, то можно использовать
Но так ли они случайны?
Для этого мы можем обратиться к стандарту RFC 4122, который содержит целых 5 различных подходов к созданию этих идентификаторов.
UUID — это просто 128-битные числа, используемые для уникальной идентификации элементов при разработке ПО. Их каноническое текстовое представление это пять групп шестнадцатеричных символов, разделённых дефисами: 8-4-4-4-12.
Что-то вроде:
В эту, на первый взгляд, случайную серию шестнадцатеричных символов встроена информация о реализации UUID.
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Значения на позициях M и N однозначно определяют версию и вариант UUID.
Версия
Номер версии идентифицируется путем просмотра старших 4 битов значения в позиции M
Вариант
Поле варианта определяет расположение информации, встроенной в UUID. Интерпретация всех остальных битов в UUID зависит от значения варианта.
😎 В iOS нас больше всего интересует RFC 2144 версии 4
Более ранние версии универсальных уникальных идентификаторов полагались на дату и время, MAC-адрес устройства и идентификаторы namespace (можно прочесть ниже).
Всякий раз, когда структура UUID генерирует новый идентификатор, она в основном делает 122 броска кубика (или костей 😅), чтобы получить 122 случайных бита. Остальные ведь нужны нам для идентификации версии и варианта, помните?
Немного математики говорит нам, что всего у нас 3 ундециллиона идентификаторов, или 5,3 триллионов триллионов триллионов (ладно, чтобы было проще 5.3 и 36 нулей). ЭТО МНОГО!
Количество идентификаторов, которые необходимо сгенерировать, чтобы иметь 50-процентную вероятность коллизии (т. е. два одинаковых идентификатора), составляет 2,71 квинтиллиона, или 2,71 в 1018 степени. А я говорил, что они не на 100% уникальны!
На это потребуется 85 лет, если вы будете генерировать 1 миллиард идентификаторов в секунду.
Внимание, спойлер финальной серии сериала «Лучше звоните Солу»!
📺Почти столько же, сколько дали Солу, чёрт возьми!
Чтобы сохранить все эти идентификаторы, вы должны создать файл размером около 45 экзабайт или 45 миллионов терабайт, что намного больше, чем самые большие БД в мире.
UUID является универсально уникальным для всех устройств, баз данных, iPhone и т. д. в мире. Вероятность создания одного и того же UUID дважды ничтожно мала (но есть).
Остальные версии UUID
1️⃣ Версия 1. На основе времени + уникальный или случайный идентификатор хоста
2️⃣ Версия 2 (безопасность распределенной вычислительной среды) — менее распространена, чем первая, юзает некий специальный идентификатор, уникальный для системы.
3️⃣ Версия 3. На основе имени + хэш MD5.
4️⃣ Версия 4. PRNG (аббревиатура pseudo-random number generator). Использует большинство современных языков программирования.
5️⃣ На основе имени + хэш SHA-1.
По традиции для расширения кругозора можно прочесть следующее
📖 Документация Apple
📖 How To Generate a Random Unique Identifier
📖 Understanding How UUIDs Are Generated
📖 RFC 4122
@iOS Dev — есть вероятность, что посты отсюда вы ещё где-то увидите 😁
В документации Apple сказано, что UUID это универсальное уникальное значение для идентификации типов, интерфейсов и других элементов. Но что, если я скажу вам, что оно не такое уж уникальное?
Шанс сгенерировать один и тот же идентификатор дважды на любом устройстве планеты практически равен нулю! Ключевое слово здесь — практически, и ниже я попытаюсь рассказать, почему.
В Swift мы можем создать
UUID
довольно просто:let identifier = UUID()
print(identifier)
Результатом будут 128 случайно сгенерированных битов (если вы хотите вывести значение строки, то можно использовать
identifier.uuidString
). Но так ли они случайны?
Для этого мы можем обратиться к стандарту RFC 4122, который содержит целых 5 различных подходов к созданию этих идентификаторов.
UUID — это просто 128-битные числа, используемые для уникальной идентификации элементов при разработке ПО. Их каноническое текстовое представление это пять групп шестнадцатеричных символов, разделённых дефисами: 8-4-4-4-12.
Что-то вроде:
3422b448-2460-4fd2-9183-8000de6f8343
(подозреваю, что вы где-то такое уже видели).В эту, на первый взгляд, случайную серию шестнадцатеричных символов встроена информация о реализации UUID.
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Значения на позициях M и N однозначно определяют версию и вариант UUID.
Версия
Номер версии идентифицируется путем просмотра старших 4 битов значения в позиции M
Вариант
Поле варианта определяет расположение информации, встроенной в UUID. Интерпретация всех остальных битов в UUID зависит от значения варианта.
😎 В iOS нас больше всего интересует RFC 2144 версии 4
Более ранние версии универсальных уникальных идентификаторов полагались на дату и время, MAC-адрес устройства и идентификаторы namespace (можно прочесть ниже).
Всякий раз, когда структура UUID генерирует новый идентификатор, она в основном делает 122 броска кубика (или костей 😅), чтобы получить 122 случайных бита. Остальные ведь нужны нам для идентификации версии и варианта, помните?
Немного математики говорит нам, что всего у нас 3 ундециллиона идентификаторов, или 5,3 триллионов триллионов триллионов (ладно, чтобы было проще 5.3 и 36 нулей). ЭТО МНОГО!
Количество идентификаторов, которые необходимо сгенерировать, чтобы иметь 50-процентную вероятность коллизии (т. е. два одинаковых идентификатора), составляет 2,71 квинтиллиона, или 2,71 в 1018 степени. А я говорил, что они не на 100% уникальны!
На это потребуется 85 лет, если вы будете генерировать 1 миллиард идентификаторов в секунду.
Внимание, спойлер финальной серии сериала «Лучше звоните Солу»!
📺
Чтобы сохранить все эти идентификаторы, вы должны создать файл размером около 45 экзабайт или 45 миллионов терабайт, что намного больше, чем самые большие БД в мире.
UUID является универсально уникальным для всех устройств, баз данных, iPhone и т. д. в мире. Вероятность создания одного и того же UUID дважды ничтожно мала (но есть).
Остальные версии UUID
1️⃣ Версия 1. На основе времени + уникальный или случайный идентификатор хоста
2️⃣ Версия 2 (безопасность распределенной вычислительной среды) — менее распространена, чем первая, юзает некий специальный идентификатор, уникальный для системы.
3️⃣ Версия 3. На основе имени + хэш MD5.
4️⃣ Версия 4. PRNG (аббревиатура pseudo-random number generator). Использует большинство современных языков программирования.
5️⃣ На основе имени + хэш SHA-1.
По традиции для расширения кругозора можно прочесть следующее
📖 Документация Apple
📖 How To Generate a Random Unique Identifier
📖 Understanding How UUIDs Are Generated
📖 RFC 4122
@iOS Dev — есть вероятность, что посты отсюда вы ещё где-то увидите 😁
This media is not supported in your browser
VIEW IN TELEGRAM
Как вынести код в отдельный метод средствами Xcode?
Скорее всего, в подавляющем большинстве случаев для рефакторинга многие пользуются простым и надёжным копипастом (он же
🥷 Но есть и другой путь: выделите код, нажмите
Кстати, что такое #warning и зачем он нужен — можно прочитать вот тут.
@iOS Dev — о простых вещах понятными словами.
Скорее всего, в подавляющем большинстве случаев для рефакторинга многие пользуются простым и надёжным копипастом (он же
CMD+C CMD+V
).🥷 Но есть и другой путь: выделите код, нажмите
Refactor -> Extract to method
и укажите название нужного метода.Кстати, что такое #warning и зачем он нужен — можно прочитать вот тут.
@iOS Dev — о простых вещах понятными словами.
Как бы мог выглядеть iOS-разработчик в Эпоху Возрождения или как мне дали доступ к DALL·E
Почувствуйте игру слов😂
Я, наконец, получил свой доступ к нейросети от OpenAI и решил потратитьвесь свой запас кредитов некоторое время на проверку того, как она работает. Что могу сказать — впечатления необычные.
Как показывает практика, при корректных запросах нейросеть умеет в контекст и в целом более чем круто создаёт изображения на основе запросов.
И почему бы в пятницу не поэкспериментировать и не подумать, как бы мог выглядеть iOS-разработчик, если бы его рисовал, например, Да Винчи?
Что получилось в итоге — вы можете увидеть на скриншоте.
Как выглядел процесс создания этих изображений для меня?
1️⃣ Несколько неудачных фраз, в которых не было нужно контекста.
2️⃣ Попытка подобрать более интересные эпохи. Не уверен, нужно ли показывать айос-разработчиков в стиле авангардизма? Если соберём 33 ⚡ — сделаю!
3️⃣ Подготовка и выбор наиболее удачных изображений из всех.
Ну и то что получилось — перед вами. А какой разработчик сегодня ты? Из эпохи ренессанса, классицизма или романтизма?
@iOS Dev — что дали, то DALL·E.
Почувствуйте игру слов😂
Я, наконец, получил свой доступ к нейросети от OpenAI и решил потратить
Как показывает практика, при корректных запросах нейросеть умеет в контекст и в целом более чем круто создаёт изображения на основе запросов.
И почему бы в пятницу не поэкспериментировать и не подумать, как бы мог выглядеть iOS-разработчик, если бы его рисовал, например, Да Винчи?
Что получилось в итоге — вы можете увидеть на скриншоте.
Как выглядел процесс создания этих изображений для меня?
1️⃣ Несколько неудачных фраз, в которых не было нужно контекста.
2️⃣ Попытка подобрать более интересные эпохи. Не уверен, нужно ли показывать айос-разработчиков в стиле авангардизма? Если соберём 33 ⚡ — сделаю!
3️⃣ Подготовка и выбор наиболее удачных изображений из всех.
Ну и то что получилось — перед вами. А какой разработчик сегодня ты? Из эпохи ренессанса, классицизма или романтизма?
@iOS Dev — что дали, то DALL·E.
Как бы мог выглядеть iOS-разработчик в разных стилях живописи или как мне дали доступ к DALL·E. Часть 2!
Всегда знал, что у iOS-разработчиков есть тяга к необычным вещам
Я своё слово держу, а раз вы такие крутые😎 — то кроме авангардизма, я добавил ещё запросы и для импрессионизма с экспрессионизмом. Ну а почему бы и нет?
@iOS Dev — ниже будет ещё один бонус.
Всегда знал, что у iOS-разработчиков есть тяга к необычным вещам
Я своё слово держу, а раз вы такие крутые
@iOS Dev — ниже будет ещё один бонус.
Please open Telegram to view this post
VIEW IN TELEGRAM
Dall-E from iOS Dev.zip
36.4 MB
Как бы мог выглядеть iOS-разработчик в разных стилях живописи или как мне дали доступ к DALL·E. Часть 3 — архив.
На случай, если вам понадобится аватарка (без всяких вотермарок)
В архиве все картинки по разделам, сгенерированные Dall-E по разделам:
⚪ Ренессанс.
⚪ Классицизм.
⚪ Романтизм.
⚪ Импрессионизм.
⚪ Экспрессионизм.
⚪ Авангардизм.
@iOS Dev
На случай, если вам понадобится аватарка (без всяких вотермарок)
В архиве все картинки по разделам, сгенерированные Dall-E по разделам:
⚪ Ренессанс.
⚪ Классицизм.
⚪ Романтизм.
⚪ Импрессионизм.
⚪ Экспрессионизм.
⚪ Авангардизм.
@iOS Dev
Полное руководство по UICollectionView с примерами на Swift
Узнайте, как использовать UICollectionView с многократно используемыми компонентами UIKit и шаблоном MVVM.
📖 Автор рассказывает о двух подходах к созданию и настройке
🛠 Кроме этого, он делится своим фреймворком
📺 Кстати, рекомендую посмотреть видео Apple о продвинутых пользовательских интерфейсах.
@iOS Dev
Узнайте, как использовать UICollectionView с многократно используемыми компонентами UIKit и шаблоном MVVM.
📖 Автор рассказывает о двух подходах к созданию и настройке
UICollectionView
, а также приводит аргументы за использование кода, а не Interface Builder.🛠 Кроме этого, он делится своим фреймворком
📺 Кстати, рекомендую посмотреть видео Apple о продвинутых пользовательских интерфейсах.
@iOS Dev
Продвинутые эффекты для тени UIView с использованием shadowPath
📖 В этой статье рассматриваются необычные подходы к использованию теней.
Подробно разбирается, зачем нужно каждое из свойств:
Кроме этого демонстрируется, как можно использовать
@iOS Dev
📖 В этой статье рассматриваются необычные подходы к использованию теней.
Подробно разбирается, зачем нужно каждое из свойств:
shadowColor
, shadowOffset
, shadowOpacity
, shadowPath
и shadowRadius
, а также их комбинации.Кроме этого демонстрируется, как можно использовать
UIBezierPath
применительно к тени для создания интересного эффекта.@iOS Dev
Пример реализации автозаполнения пароля для приложения iOS
Функция Password Autofill позволяет пользователям входить в одну и ту же учетную запись на разных устройствах без необходимости запоминать учетные данные.
🌐 Например, при регистрации в веб-приложении пользователи могут придумать пароль и сохранить учетные данные в связке ключей iCloud.
Когда в какой-то момент они запускают нативное приложение для доступа к той же учетной записи, приложение предлагает учетные данные, сохраненные для веб-сайта, в строке пароля QuickType.
После аутентификации пользователя, например, с помощью
Чтобы корректно рализовать эту фичу в приложении для iOS, необходимо выполнить следующие шаги:
1️⃣ Настройка связанных доменов приложения (associated domains).
2️⃣Установка правильного типа автозаполнения для соответствующих полей.
📖 В этом материале более подробно рассматривается каждый из этих шагов.
@iOS Dev
Функция Password Autofill позволяет пользователям входить в одну и ту же учетную запись на разных устройствах без необходимости запоминать учетные данные.
🌐 Например, при регистрации в веб-приложении пользователи могут придумать пароль и сохранить учетные данные в связке ключей iCloud.
Когда в какой-то момент они запускают нативное приложение для доступа к той же учетной записи, приложение предлагает учетные данные, сохраненные для веб-сайта, в строке пароля QuickType.
После аутентификации пользователя, например, с помощью
Face ID
, система заполняет учетные данные - таким образом, их не нужно вводить повторно.Чтобы корректно рализовать эту фичу в приложении для iOS, необходимо выполнить следующие шаги:
1️⃣ Настройка связанных доменов приложения (associated domains).
2️⃣Установка правильного типа автозаполнения для соответствующих полей.
📖 В этом материале более подробно рассматривается каждый из этих шагов.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Что такое phyllotaxis или как повторить анимацию в Wallet и Lock Screen в iOS 16
Оговорюсь, я как и прежде не использую Swift UI в проде, и наверняка код можно сделать чище
С выходом новой iOS многие обратили внимание на крутую анимацию при переходе на заблокированный экран и обратно. Philip Davis в твиттере дополнил, что по факту используемая фигура очень похожа на phyllotaxis (филлотаксис по-русски). Так что же это за зверь такой?
Время нового факта
Филлотаксис — одна из природных загадок, известная со времён Леонардо да Винчи. Название с древнегреческого — «расположение листьев».
Загадочным является наблюдаемое в мире растений геометрически правильное расположение. Вспомните, например, как выглядит подсолнух😏.
Если сосчитать количество однотипных спиралей на поверхности, то с большой вероятностью мы получим одну из пар, образованных двумя соседними числами Фибоначчи.
☺️ Спасибо математикам за псевдокод:
Для упрощения терминологии: n это индекс семечка (у нас это просто кружок,
Что ж, попробуем повторить природное явление с помощью Swift!
1️⃣ Создадим
2️⃣ Радиус можно рассчитать по следующей формуле
3️⃣ Заполяем поле с помощью
4️⃣ И небольшой эффект анимации:
😎 В итоге получится то, что вы видите на гифке.
@iOS Dev — решаю загадки Да Винчи на Swift.
Оговорюсь, я как и прежде не использую Swift UI в проде, и наверняка код можно сделать чище
С выходом новой iOS многие обратили внимание на крутую анимацию при переходе на заблокированный экран и обратно. Philip Davis в твиттере дополнил, что по факту используемая фигура очень похожа на phyllotaxis (филлотаксис по-русски). Так что же это за зверь такой?
Время нового факта
Филлотаксис — одна из природных загадок, известная со времён Леонардо да Винчи. Название с древнегреческого — «расположение листьев».
Загадочным является наблюдаемое в мире растений геометрически правильное расположение. Вспомните, например, как выглядит подсолнух😏.
Если сосчитать количество однотипных спиралей на поверхности, то с большой вероятностью мы получим одну из пар, образованных двумя соседними числами Фибоначчи.
☺️ Спасибо математикам за псевдокод:
n = caseIndex
base_angle = pi*(1+sqrt(5))
r = sqrt(n)
theta = n*base_angle
x = r*cos(theta)
y = r*sin(theta)
Для упрощения терминологии: n это индекс семечка (у нас это просто кружок,
baseAngle
некий стартовый угол, r - радиус, x и y — позиции, на которые мы должны поместить наше семечко).
Что ж, попробуем повторить природное явление с помощью Swift!
1️⃣ Создадим
GeometryReader
, proxy.size
будет размером поля. xCenter
и yCenter
- координаты центра, от которых я отталкивался.2️⃣ Радиус можно рассчитать по следующей формуле
let radius:Double = maxWidth * sqrt(Double(i))
. maxWidth
это ширина семечка (тех, что ближе к краю поля).3️⃣ Заполяем поле с помощью
CircleInside
в зависимости от максимального количества "семечек" внутри поля.4️⃣ И небольшой эффект анимации:
scaleEffect
и rotationEffect
по тапу.😎 В итоге получится то, что вы видите на гифке.
@iOS Dev — решаю загадки Да Винчи на Swift.
Прокачиваем push-уведомления для iOS: Rich Push Notifications
Узнайте, как изменять и улучшать push-уведомления до того, как они будут представлены пользователю
Push-уведомления позволяют приложениям передавать оповещения пользователям — даже если они не используют устройство активно.
Хотя уведомления уже показывают полезную информацию, их истинная мощь проявляется в Rich Notifications.
Rich Notifications позволяют перехватывать notification payload и дают вам возможность их оформления в соответствии с потребностями пользователя.
Это позволяет отображать кастомный UI, который может включать в себя и действия с кнопками.
📖 В этом материале вы узнаете, как изменять и улучшать входящий контент, как создавать собственный интерфейс для таких уведомлений и многое другое.
@iOS Dev
Узнайте, как изменять и улучшать push-уведомления до того, как они будут представлены пользователю
Push-уведомления позволяют приложениям передавать оповещения пользователям — даже если они не используют устройство активно.
Хотя уведомления уже показывают полезную информацию, их истинная мощь проявляется в Rich Notifications.
Rich Notifications позволяют перехватывать notification payload и дают вам возможность их оформления в соответствии с потребностями пользователя.
Это позволяет отображать кастомный UI, который может включать в себя и действия с кнопками.
📖 В этом материале вы узнаете, как изменять и улучшать входящий контент, как создавать собственный интерфейс для таких уведомлений и многое другое.
@iOS Dev
Что представляет собой процесс собеседования в Netflix?
Джорданна Квок поделилась опытом управления командой мобильных разработчиков в Netflix в интервью Полу Хадсону, о принципах найма и о многом другом
✍️ Ниже основные тезисы из интервью на случай, если вы решитесь попытать свои силы:
🟢 В команде Джорданны в Netflix не задают вопросов с LeetCode, и в целом на собеседовании стараются избегать головоломок, анализа сложности и т. д. Причина в том, что они не используют это в повседневной работе.
Зато можно спросить, что такое коллекции? Что представляет собой многопоточность? Вам нужно загрузить, я не знаю, 10 изображений — как вы убедитесь, что они правильно закэшированы? Такие вещи представляют собой настоящие проблемы, с которыми все инженеры будут сталкиваться изо дня в день в Netflix, поэтому именно такие вопросы мы будем задавать на большинстве технических собеседований.
GCD, управление памятью и тому подобное, в целом основы iOS — то, что хотелось бы услышать от кандидатов.
🟢 Намного полезнее тестовое задание. Так как оно лучше отразит, что вы на самом деле испытаете на рабочем месте. Потому что вы получите открытый вопрос, например, «создать приложение, которое что-то делает».
🟢 Даже если что-то не получается, мы делаем все возможное, чтобы дать обратную связь.
🟢 Мы нанимали людей на их второе или третье собеседование, поэтому я просто хочу сказать, что это не значит, что если вы не прошли в первый раз, это не значит, что вы не получите роль в будущем.
Терпение и труд всё перетрут?
Что я думаю об этом?
Те процессы, о которых рассказала Джордана, выглядят более чем разумными. Особенно интересна позиция про алгоритмические секции, хотя Netflix и входит в тот самый FAANG, компании из которого славятся своим харкдором.
🤔 Пусть алгоритмы не являются краеугольным камнем, но это совершенно не означает, что их не нужно учить.
@iOS Dev — об алгоритмах мы ещё поговорим
Джорданна Квок поделилась опытом управления командой мобильных разработчиков в Netflix в интервью Полу Хадсону, о принципах найма и о многом другом
✍️ Ниже основные тезисы из интервью на случай, если вы решитесь попытать свои силы:
🟢 В команде Джорданны в Netflix не задают вопросов с LeetCode, и в целом на собеседовании стараются избегать головоломок, анализа сложности и т. д. Причина в том, что они не используют это в повседневной работе.
Зато можно спросить, что такое коллекции? Что представляет собой многопоточность? Вам нужно загрузить, я не знаю, 10 изображений — как вы убедитесь, что они правильно закэшированы? Такие вещи представляют собой настоящие проблемы, с которыми все инженеры будут сталкиваться изо дня в день в Netflix, поэтому именно такие вопросы мы будем задавать на большинстве технических собеседований.
GCD, управление памятью и тому подобное, в целом основы iOS — то, что хотелось бы услышать от кандидатов.
🟢 Намного полезнее тестовое задание. Так как оно лучше отразит, что вы на самом деле испытаете на рабочем месте. Потому что вы получите открытый вопрос, например, «создать приложение, которое что-то делает».
🟢 Даже если что-то не получается, мы делаем все возможное, чтобы дать обратную связь.
🟢 Мы нанимали людей на их второе или третье собеседование, поэтому я просто хочу сказать, что это не значит, что если вы не прошли в первый раз, это не значит, что вы не получите роль в будущем.
Терпение и труд всё перетрут?
Что я думаю об этом?
Те процессы, о которых рассказала Джордана, выглядят более чем разумными. Особенно интересна позиция про алгоритмические секции, хотя Netflix и входит в тот самый FAANG, компании из которого славятся своим харкдором.
🤔 Пусть алгоритмы не являются краеугольным камнем, но это совершенно не означает, что их не нужно учить.
@iOS Dev — об алгоритмах мы ещё поговорим
Как приостановить Task в Swift?
Структура
Речь идёт именно о наносекундах: нужно написать
Для этого нужно вызвать
ℹ️ Важное уточнение
Вызов
При этом происходит некоторое смещение, поскольку система может быть занята другой работой, но мы по крайней мере, можем быть уверены, что оно не закончится раньше указанного промежутка.
📖 Использование наносекунд немного неуклюже, но на данный момент у Swift нет альтернативы.
🤩 Кстати! В отличие от
@iOS Dev
Структура
Task
в Swift
имеет статический метод sleep()
, который приводит к приостановке текущей задачи по крайней мере на некоторое количество наносекунд. Речь идёт именно о наносекундах: нужно написать
1_000_000_000
, чтобы получить 1 секунду. Для этого нужно вызвать
Task.sleep()
с помощью await
, так как это приведет к приостановке задачи, и вам также нужно использовать try
, потому что sleep()
приведёт к ошибке в случае, если task
будет отменён.ℹ️ Важное уточнение
Вызов
Task.sleep()
заставит текущую задачу «спать» по крайней мере столько времени, сколько вы запросили. При этом происходит некоторое смещение, поскольку система может быть занята другой работой, но мы по крайней мере, можем быть уверены, что оно не закончится раньше указанного промежутка.
📖 Использование наносекунд немного неуклюже, но на данный момент у Swift нет альтернативы.
Thread.sleep()
, Task.sleep()
не блокирует поток, позволяя ему взять дополнительную работу из других мест, если потребуется.@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Разница между Thread.sleep() и Task.sleep()
Сделал наглядную табличку для предыдущего поста, примеры можно посмотреть здесь
@iOS Dev
Сделал наглядную табличку для предыдущего поста, примеры можно посмотреть здесь
@iOS Dev
Что такое Thread Sanitizer и при чём тут гонки данных в Swift?
Thread Sanitizer, также известный как TSan — это инструмент на базе LLVM для изучения проблем с потоками в вашем коде, написанном на языках Swift и C. Он был впервые представлен в Xcode 8 и может стать отличным инструментом для поиска менее заметных ошибок в коде, например, гонок данных.
📖 Автор этой статьи делится, как Thread Sanitizer помог решить проблемы с нестабильными тестами и странными сбоями, в которых не получалось точно определить причину.
Возможно, вы не использовали TSan раньше, поскольку может быть немного непонятно, что делает этот инструмент и как он работает.
В материале затрагиваются важные темы:
⚪ Что такое гонки данных (data races).
⚪ Примеры гонки данных в Swift.
⚪ Использование Thread Sanitizer для обнаружения гонок данных.
⚪ Ограничения для Thread Sanitizer.
⚪ Подходы к решению гонки данных. Также стоит обратить внимание на эту статью и этот пост.
@iOS Dev
Thread Sanitizer, также известный как TSan — это инструмент на базе LLVM для изучения проблем с потоками в вашем коде, написанном на языках Swift и C. Он был впервые представлен в Xcode 8 и может стать отличным инструментом для поиска менее заметных ошибок в коде, например, гонок данных.
📖 Автор этой статьи делится, как Thread Sanitizer помог решить проблемы с нестабильными тестами и странными сбоями, в которых не получалось точно определить причину.
Возможно, вы не использовали TSan раньше, поскольку может быть немного непонятно, что делает этот инструмент и как он работает.
В материале затрагиваются важные темы:
⚪ Что такое гонки данных (data races).
⚪ Примеры гонки данных в Swift.
⚪ Использование Thread Sanitizer для обнаружения гонок данных.
⚪ Ограничения для Thread Sanitizer.
⚪ Подходы к решению гонки данных. Также стоит обратить внимание на эту статью и этот пост.
@iOS Dev