iOS Dev
7.6K subscribers
970 photos
78 videos
1 file
1.12K links
🍏Канал об iOS-разработке, необычных подходах и решениях.
👨‍💻Автор: Виктор Грушевский (@Viktorianec)
Темы:
⭐️ Подготовка к собеседованиям.
⭐️ Архитектуры и алгоритмы.
⭐️ Код. Много кода.

⚒️База знаний: https://boosty.to/ios_dev

#ios #mobile #swift
加入频道
Холодный и тёплый запуск приложения — о чём речь?

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

ℹ️ В iOS активация может быть либо запуском (launch), либо возобновлением (resume).

Launch — начало процесса, а resume — это когда в вашем приложении уже есть активный процесс, даже если он приостановлен.

Resume, как правило, намного быстрее, и работа по оптимизации запуска и возобновления отличается. В macOS система, например, не завершает ваш процесс в рамках обычного использования.

Что же такое холодный и тёплый запуски?

Активация вашего приложения значительно зависит от предыдущих действий на устройстве.

Например, в iOS, если вы свайпаете до хоумскрина и сразу же снова входите в приложение, то получите самую быструю возможную активацию. Вероятнее всего, это будет resume.

Когда система определяет, что нужен запуск, это обычно называют «теплым запуском».

В iOS ваше приложение обычно вытесняется из памяти, чтобы предоставить foreground-приложению больше ресурсов.

Фреймворки также могут потребовать повторного запуска. Этот сценарий или запуск сразу после загрузки часто называют «холодным запуском».

Более корректно размышлять о тёплом и холодном запусках как о спектре.

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

📺 Для большего погружения рекомендую это видео с WWDC.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Простой способ проверить тип в Swift

ℹ️ Кроме as? можно использовать оператор проверки типа is, чтобы проверить, относится ли экземпляр к определенному типу подкласса.

Оператор проверки типа вернёт true, если экземпляр относится к этому типу подкласса, и false, если нет.

В приведённом примере magicBool может быть либо Int, либо String.

Кстати, я изучаю возможности инструментов Apple и, как видите, гифки выходят на новый уровень!

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
iOS Clean architecture на примере реализации фичи с использованием MVVM, Repository, URLSession

📖 В этом материале автор расскажет про:

1️⃣ Реализацию шаблона проектирования MVVM очень простым способом без дополнительных фреймворков.

2️⃣ Полностью несвязанную систему загрузки для любого источника данных с подходом Repository.

3️⃣ Создание клиента на базе URLSession.

4️⃣ Корректное использование API.

И, что еще более важно, про создание функции, которую можно изолировать, смоделировать и протестировать на каждом уровне.

🛠 Бонус! Репозиторий с проектом, где вы сразу можете посмотреть на решение.

@iOS Dev
Как добавить поддержку файлов с любым расширением в вашем приложении?

🔆 Представьте ситуацию, что вы делаете кастомный видеоредактор или архиватор и нужно поддерживать не только стандартные, но и свои файлы в приложении.

Если необходимо заставить систему распознавать файл, вы можете использовать Document Types и Exported Type Identifiers.

В документации Apple четко указано, что новый тип должен соответствовать хотя бы одному из public-типов.

public.data— базовый тип для byte streams.

public.content — базовый тип для смешанного контента. Например, файл PDF содержит как текст, так и специальные данные форматирования.

📖 Автор этой статьи доступно объясняет не только, как поддерживать кастомные типы данных и шарить их, но и как открывать эти файлы в вашем приложении.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Подборка необычных эффектов в IOS с конференции Tokyo iOS Meetup
Stack Overflow говорил, что это будет просто (спойлер: это оказалось отнюдь не просто)

Тим Оливер, в прошлом разработчик Realm и pixiv, делится своим опытом реализации сразу нескольких необычных вещей в iOS, кажущихся на первый взгляд тривиальными, но на самом деле содержащими непростую реализацию.

📺 Видео с конференции доступно здесь.

@iOS Dev
Рекурсия в Swift: определение, примеры, код
Примером рекурсии в реальном мире может быть размещение двух параллельных зеркал друг против друга. Любой объект между ними будет отражаться рекурсивно.

Среди плюсов их использования:

🔘 Это делает наш код короче и чище.
🔘 Рекурсия требуется в задачах, касающихся структур данных и продвинутых алгоритмов, таких как обход графа и дерева.

Минусы, впрочем, тоже есть:

🔘 Это занимает больше места в стеке по сравнению с итеративной программой.
🔘 Реализация использует больше процессорного времени.
🔘 Отладка может быть более сложной по сравнению с эквивалентной итеративной программой.

📖 В этой статье наглядно объясняется, что такое рекурсивные функции в Swift и объясняется работа таких функций на примерах

@iOS Devрекурсия в Swift с примерами в этом посте
Please open Telegram to view this post
VIEW IN TELEGRAM
Async/await в Swift c примером использования на базе существующего проекта

Async await является частью новых изменений структурированного параллелизма, которые появились в Swift 5.5 во время WWDC 2021.

ℹ️ Параллелизм в Swift означает возможность одновременного запуска нескольких фрагментов кода.

Пусть это и очень упрощенное описание, но оно должно дать вам представление о том, насколько важен параллелизм в Swift для производительности ваших приложений.

📖 Этот материал раскрывает следующие понятия:

🔘 Определение async.

🔘 Определение await.

🔘 Для чего нужен структурированный параллелизм (structured concurrency).

🔘 Добавление async-await в существующий проект.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Техники перехода между разными экранами: от простых к интерактивным

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

1️⃣ Создание кастомных переиспользуемых переходов.

2️⃣ Переходы между экранами: добавляем естественности.

3️⃣ Переходы между экранами: задание произвольного размера.

Нельзя не согласиться с автором насчёт следующего вывода: иногда стоит приложить усилия, чтобы разобраться в непростом API, чтобы в будущем сэкономить время при реализации более сложных переходов.

🛠 Репозиторий с примерами кода из статьи.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Реализация плавного перехода между цветами в Swift

Эту красивую технику можно создать, вычислив средний цвет входного изображения.

📖 Этот пример был создан с использованием изображений из Unsplash для создания желаемого эффекта.

🛠 Посмотреть на решение в коде можно на Github.

@iOS Dev
Создание Keyboard Extension для азбуки Морзе

Keyboard Extensions позволяют пользователям добавлять дополнительные клавиатуры в список доступных.

Отличным примером дополнительной клавиатуры является встроенная в iOS клавиатура с эмодзи.

📖 С помощью этого материала вы создадите одно из таких расширений для азбуки Морзе.

🧐 Автор даже считает, что к концу туториала вы сможете её выучить!

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Пример реализации диаграммы с затемнением до указанного момента времени

В этом материале можно узнать, как построить диаграмму, отображающую УФ-индекс в течение дня (похожую на системное приложение погоды).

На диаграмме также используется линейный градиент для значения УФ-индекса, реализовано отображение временной шкалы, и затемняющий слой для уже прошедшего отрезка.

🛠 Код доступен по этой ссылке.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Анализ текста в реальном времени с помощью Word Tagger (+ пример приложения)

Возможно, вы помните материал от Максима Скорынина. Я выкладывал в канале первую часть большого материала про работу с CreateML и анализ текста.

📖 Вышло продолжение, в котором создаётся приложение для iOS с нуля, объясняется про GoogleMLKit/TextRecognition и используется Live Text, которые позволяют нам распознавать текст из видеопотока или изображения с помощью камеры телефона.

Кроме этого, используется модель Word Tagger для конвертации англоязычного текста. А также вы сможете узнать о применении фреймворка NaturalLanguagе в реальном проекте.

🛠 Полностью пример приложения можно посмотреть в этом репозитории.

@iOS Devесли у вас есть примеры проектов или статей, которыми вы хотите поделиться с сообществом, напишите мне🧑‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
10 советов для успешного запуска пет-проектов от автора avanderlee

1️⃣ Создайте фокус. По иронии судьбы, сторонние проекты — одна из самых больших ловушек для незавершенных побочных проектов.
2️⃣ Смотрите на вещи реалистично. Вы не сможете сделать всё сразу! От себя я бы добавил, что этот совет касается разработки и в крупных компаниях.
3️⃣ Установите приоритеты.
4️⃣ Планирование — это ключ.
5️⃣ 10 минут в день засчитываются за 5 часов в месяц.
6️⃣ Умейте остановиться вовремя, даже если вы получаете удовольствие (и вы готовы кодить до полуночи).
7️⃣ Создайте задачи на будущее. А #warning вам поможет.
8️⃣ Используйте автоматизацию и инструменты, чтобы сэкономить время.
9️⃣ Поднимите себе настроение с друзьями-единомышленниками.
🔟 Не стесняйтесь отпраздновать успех (или хотя бы запуск проекта).

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

⭐️ А вот тут можно прочесть отличные от Пола Хадсона про профессиональное развитие.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Причина и два способа исправить ошибку: «The compiler is unable to type-check this expression in reasonable time»

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

Например, комбинация выражений =, +, try, await слишком сложна для компилятора Swift.

Два простых способа, которые помогут победить этот неприятный момент:

1️⃣ Разбить длинное выражение на более мелкие.

// Вместо
var longExpression = "a" + "b" + "c" + "d"

// Использовать
var temp1 = "a" + "b"
var temp2 = "c" + "d"
var smallerExpression = temp1 + temp2


2️⃣ Можно уменьшить количество выражений.

// Вместо
var longExpression = "a" + "b" + "c" + "d"

// Использовать
var reduceExpression = "ab" + "cd"


📖 Детальнее можно прочесть в этой статье.

👩‍🎓 Кстати, вы знали, что оператор + мощно перегружен и содержит около 60 различных функций?

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
UIScrollView и как он работает

📖 Илья Лобанов подробно рассказывает о том, как работает UIScrollView: приводит примеры замедления, баунса, spring animation и rubber band effect.

И даёт советы, как можно добиться естественной анимации и отзывчивого интерфейса в приложениях.

В материале можно получить представление и примеры работы со следующими эффектами:

🔘 Тестовый SimpleScrollView.
🔘 Замедление (Deceleration).
🔘 Реализация замедления.
🔘 Анимация пружины (Spring Animation).
🔘 Spring Animation в iOS SDK.
🔘 Реализация анимации пружины.
🔘 Rubber Band Effect.
🔘 Реализация Rubber Band Effect.
🔘 Примеры использования.

📺 Видео доклада можно посмотреть здесь.

🛠 Примеры кода из статьи: github.

🤩 Бонус: видео с WWDC о проектировании интерфейсов.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Channel photo updated
Настройка Shortcut Actions с параметрами для iOS-приложений с примером кода

📖 В этом материале автор рассказывает о создании нескольких шорткатов, которые позволят выполнять основные математические операции.

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

🛠 Если же вы предпочитаете исследовать код, то готовый проект доступен по этой ссылке.

@iOS Dev
Core Graphics: что это, как появился и как на это повлияли деньги?

Core Graphics, также известный под своим маркетинговым названием «Quartz», является одним из старейших связанных с графикой API на платформах.

Quartz является основой большинства 2D-вещей. Хотите рисовать фигуры, заполнять их градиентами и придавать им тени? Это Core Graphics. Показывать изображения на экране? Они проходят через Core Graphics. Создавать PDF? Эм, ну это всё ещё Core Graphics.

CG — это довольно большой API, охватывающий весь спектр базовых геометрических структур данных (таких как точки, размеры, векторы и прямоугольники) и вызовы для манипулирования ими, которые преобразуют пиксели в изображения или в экран, вплоть до обработки событий.

Почему графический API работает с пользовательскими событиями?

Как и все для всего остального, нужно вспомнить историю. А знание истории может объяснить, почему части Core Graphics ведут себя именно так.

Еще в 1980-х, графические API были довольно примитивными. Инструменты были ограничены палитрой и рисовать можно было только основные фигуры. Существовали функции «побитового копирования».

В QuickDraw на Mac была интересная функция, называемая регионами для обрезки, контура или хиттеста (что-то знакомо?✅️)

В 1985 году Apple представила LaserWriter — принтер, мощнее компа, который имел в 12 раз больше оперативной памяти и стоил вдвое дороже. Этот принтер производил (для того времени) невероятно красивый результат благодаря технологии PostScript. Интерпретатор языка PostScript был встроен в LaserWriter, поэтому, когда программа на Mac хотела что-то напечатать, программа (или драйвер принтера) генерировала программный код, который загружался в принтер и выполнялся. А вот тут даже есть пример.

Помимо рендеринга страниц, PostScript является полным по Тьюрингу и вы даже можете написать веб-сервер с его помощью.

Когда инженеры NeXT проектировали свою систему, они выбрали PostScript в качестве модели рендеринга. Отображение PostScript было основой взаимодействия с пользователем. События проходили через систему DPS, а затем отправлялись в приложения.

Почему OS X и iOS не используют Display PostScript?

💵 Дело в деньгах! Adobe взимала лицензионный сбор за Display PostScript.

Кроме того, Apple хорошо известна тем, что хочет владеть как можно большей частью своего технологического стека.

Обычно говорят, что Quartz «основан» на PDF, и в некотором смысле это правда. PDF (Adobe's Portable Document Format) — это модель рисования PostScript.

Quartz был разработан так, чтобы использование API было на то, что поддерживается в PDF, что делало создание PDF-файлов на платформе почти тривиальным.

Те же основные механизмы были сохранены, хотя Display PostScript был заменен на Quartz, включая обработку событий.

🧐 Apple разработала новую структуру, объединив модель PDF с поддержкой альфа-канала, и сегодня мы знаем ее как Quartz 2D. Apple внутри компании называет эту графическую библиотеку Core Graphics, а общедоступное название — Quartz 2D.

📖 Источники при подготовке материала: Mihaela MJ, Mark Dalrymple, дока эпл и, конечно,

@iOS Devтеперь вы знаете больше!
Please open Telegram to view this post
VIEW IN TELEGRAM
DispatchSource: обнаружение изменений в файлах и папках в Swift

Семейство типов DispatchSource из GCD содержит ряд объектов, способных отслеживать события, связанные с операционной системой.

📖 В этой статье приводится хороший пример, как использовать DispatchSource для мониторинга лог-файла и создания debug-only view, которое покажет последние логи в приложении.

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

⭐️ Дополнительно: DispatchSource в доке эпла.

@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM