Полное руководство по работе с URL в Swift (и SwiftUI)
URL-адреса используются повсеместно, и приложения для iOS не являются исключением.
Наиболее распространенными примерами являются веб-контент, локальные файлы и конечные точки REST API.
📖 В этой статье разбираются пошагово следующие аспекты:
1️⃣ Что такое URL и как использовать URL в Swift.
2️⃣ Как URL-адреса идентифицируют локальные и веб-ресурсы.
3️⃣ Управление URL и преобразование их в более удобные типы.
4️⃣ Создание URL-адреса и проверка его отдельных компонентов.
5️⃣ Использование URL для чтения и записи в файловой системе устройства.
6️⃣ Показаны примеры работы с URL-адресами в приложениях SwiftUI.
Рекомендую после этого материала ознакомиться и с более любопытной темой:
📖 Создание переиспользуемой системы для сложных URL-запросов с помощью Swift.
@iOS Dev
URL-адреса используются повсеместно, и приложения для iOS не являются исключением.
Наиболее распространенными примерами являются веб-контент, локальные файлы и конечные точки REST API.
📖 В этой статье разбираются пошагово следующие аспекты:
1️⃣ Что такое URL и как использовать URL в Swift.
2️⃣ Как URL-адреса идентифицируют локальные и веб-ресурсы.
3️⃣ Управление URL и преобразование их в более удобные типы.
4️⃣ Создание URL-адреса и проверка его отдельных компонентов.
5️⃣ Использование URL для чтения и записи в файловой системе устройства.
6️⃣ Показаны примеры работы с URL-адресами в приложениях SwiftUI.
Рекомендую после этого материала ознакомиться и с более любопытной темой:
📖 Создание переиспользуемой системы для сложных URL-запросов с помощью Swift.
@iOS Dev
Семафоры в Swift и что это такое: определение, немного теории и примеры
ℹ️ Семафоры дают нам возможность контролировать доступ к общему ресурсу. Сам семафор состоит из очереди потоков и значения счетчика (типа
Очередь потоков используется семафором для отслеживания ожидающих потоков в порядке FIFO (первый поток, введенный в очередь, будет первым, кто получит доступ к общему ресурсу, как только он будет доступен).
Значение счетчика используется семафором, чтобы решить, должен ли поток получить доступ к общему ресурсу или нет. При этом оно изменяется, когда мы вызываем
📖 В этом материале буквально на пальцах объясняется:
🔘 Что такое семафоры.
🔘 Принципы работы семафоров.
🔘 А также автор приводит два примера для упрощения понимания.
@iOS Dev
ℹ️ Семафоры дают нам возможность контролировать доступ к общему ресурсу. Сам семафор состоит из очереди потоков и значения счетчика (типа
Int
). Очередь потоков используется семафором для отслеживания ожидающих потоков в порядке FIFO (первый поток, введенный в очередь, будет первым, кто получит доступ к общему ресурсу, как только он будет доступен).
Значение счетчика используется семафором, чтобы решить, должен ли поток получить доступ к общему ресурсу или нет. При этом оно изменяется, когда мы вызываем
signal()
или wait()
.📖 В этом материале буквально на пальцах объясняется:
🔘 Что такое семафоры.
🔘 Принципы работы семафоров.
🔘 А также автор приводит два примера для упрощения понимания.
@iOS Dev
Давайте остановим фильтрацию на секунду: альтернативные способы обработки коллекций
Когда мы хотим удалить элементы из коллекции, мы можем использовать тривиальный метод
📖 В этом материале вы можете найти некоторые альтернативы для
Некоторые из этих альтернатив более понятны и даже имеют оптимизацию производительности.
В статье акцентировано внимание на
Конечно же, с примерами.
@iOS Dev
Когда мы хотим удалить элементы из коллекции, мы можем использовать тривиальный метод
filter
, чтобы отфильтровать элементы, которые нам не нужны.📖 В этом материале вы можете найти некоторые альтернативы для
filter
, которые могут лучше соответствовать решаемым задачам. Некоторые из этих альтернатив более понятны и даже имеют оптимизацию производительности.
В статье акцентировано внимание на
removeAll(where:)
, contains(where:)
, allSatisfy(predicate:), reduce
и first(where:)
. Конечно же, с примерами.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
RunLoop.main и DispatchQueue.main: объяснение различий
📖 Во время код-ревью автор материала сталкивался с непоследовательностью в использовании обоих, и решил объяснить, в чём различия. Статья разбита на следующие блоки:
1️⃣ Что такое
2️⃣ Что такое
3️⃣ Различия между
4️⃣ Нужно ли использовать
Спойлер:
Наиболее существенное различие между RunLoop.main и DispatchQueue.main заключается в том, что последний выполняется напрямую, когда RunLoop может быть занят. Например, представление загруженного изображения во время прокрутки будет немедленно отображаться только при использовании DispatchQueue.main в качестве планировщика.
@iOS Dev
RunLoop.main
и DispatchQueue.main
часто используются в качестве планировщиков в Combine. 📖 Во время код-ревью автор материала сталкивался с непоследовательностью в использовании обоих, и решил объяснить, в чём различия. Статья разбита на следующие блоки:
1️⃣ Что такое
RunLoop.main
.2️⃣ Что такое
DispatchQueue.main
.3️⃣ Различия между
RunLoop.main
и DispatchQueue.main
.4️⃣ Нужно ли использовать
RunLoop.main
?Спойлер:
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Объяснение параллелизма: как создать многопоточное приложение для iOS
Параллелизм в iOS — обширная (даже гигантская) тема. Автор пишет, что если вы никогда раньше не использовали GCD, эта статья — отличное место для начала.
В частности, объясняется разница между последовательными и параллельными очередями (
📖 А сам материал разбит на следующие части:
1️⃣ Параллелизм и Grand Central Dispatch.
2️⃣
3️⃣ Пример использования DispatchWorkItem.
4️⃣ Sync vs Async.
5️⃣ Что может вызвать deadlock и для чего можно использовать
6️⃣ Serial vs Concurrent.
7️⃣ Подводные камни. Кстати, тут интересный пример про машину, блокирующую скорую на узкой улице.
Также автор затрагивает (правда, не углубляясь в тему) взрыв потоков и гонки.
🛠 Приложение из статьи доступно на github.
@iOS Dev
Параллелизм в iOS — обширная (даже гигантская) тема. Автор пишет, что если вы никогда раньше не использовали GCD, эта статья — отличное место для начала.
В частности, объясняется разница между последовательными и параллельными очередями (
serial
и concurrent
), а также различия между синхронным и асинхронным выполнением.📖 А сам материал разбит на следующие части:
1️⃣ Параллелизм и Grand Central Dispatch.
2️⃣
Dispatch Queues
.3️⃣ Пример использования DispatchWorkItem.
4️⃣ Sync vs Async.
5️⃣ Что может вызвать deadlock и для чего можно использовать
async
.6️⃣ Serial vs Concurrent.
7️⃣ Подводные камни. Кстати, тут интересный пример про машину, блокирующую скорую на узкой улице.
Также автор затрагивает (правда, не углубляясь в тему) взрыв потоков и гонки.
🛠 Приложение из статьи доступно на github.
@iOS Dev
Шаринг файлов между приложением iOS и расширениями Widget и WatchKit
📖 Из этой статьи вы узнаете, как поделиться файлом, загруженным или созданным вашим приложением iOS, с виджетом или расширением WatchKit.
А также узнаете про:
🔘 Создание и работу с
🔘 Чтение файла из вашего расширения.
🔘 Перенос файла из приложения iOS в расширение
🔘 Сохранение файла в расширении
Кстати, про необычные варианты обмена данными между приложениями iOS можно прочитать в этом посте(казалось бы, при чём тут 🟡 iOS Photos) .
@iOS Dev
📖 Из этой статьи вы узнаете, как поделиться файлом, загруженным или созданным вашим приложением iOS, с виджетом или расширением WatchKit.
А также узнаете про:
🔘 Создание и работу с
App Groups
.🔘 Чтение файла из вашего расширения.
🔘 Перенос файла из приложения iOS в расширение
WatchKit
.🔘 Сохранение файла в расширении
WatchKit
.Кстати, про необычные варианты обмена данными между приложениями iOS можно прочитать в этом посте
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Метатипы в Swift: что такое .self, .Type и .Protocol?
Метатипы очень полезны в Swift, и вы наверняка использовали их неоднократно.
К сожалению, в коде они выглядят довольно странно, что может вызвать некоторую путаницу при попытке понять, что они собой представляют на самом деле.
📖 В этом материале Бруно Роша подробно объясняет следующее:
1️⃣ Что представляет собой метатип?
2️⃣ Отличия динамических метатипов от статических.
3️⃣ Метатипы протоколов.
4️⃣ Ещё больше вариантов использования метатипов.
@iOS Dev
Метатипы очень полезны в Swift, и вы наверняка использовали их неоднократно.
К сожалению, в коде они выглядят довольно странно, что может вызвать некоторую путаницу при попытке понять, что они собой представляют на самом деле.
📖 В этом материале Бруно Роша подробно объясняет следующее:
1️⃣ Что представляет собой метатип?
2️⃣ Отличия динамических метатипов от статических.
3️⃣ Метатипы протоколов.
4️⃣ Ещё больше вариантов использования метатипов.
@iOS Dev
Как создать виджет для экрана блокировки в iOS?
В iOS 16 Apple серьезно переработала экран блокировки.
Поскольку виджеты для хоумскрина и для локскрина работают на
📖 В этом материале рассказывается о необходимых шагах и приводится пример кода для создания такого виджета.
@iOS Dev
В iOS 16 Apple серьезно переработала экран блокировки.
Поскольку виджеты для хоумскрина и для локскрина работают на
WidgetKit
, способ создания для экрана блокировки очень похож на вот этот. 📖 В этом материале рассказывается о необходимых шагах и приводится пример кода для создания такого виджета.
@iOS Dev
Локальное управление несколькими версиями Swift
Самый распространенный способ установки версии Swift — это загрузка Xcode.
В некоторых случаях может потребоваться загрузить тулчейн, не связанный с релизной версией Xcode, например для другой архитектуры вроде WebAssembly.
📖 В этой статье объясняется, как установить и использовать тулчейн Swift как вручную, так и с помощью инструмента командной строки под названием swiftenv (⭐1.9k на github).
@iOS Dev
Самый распространенный способ установки версии Swift — это загрузка Xcode.
В некоторых случаях может потребоваться загрузить тулчейн, не связанный с релизной версией Xcode, например для другой архитектуры вроде WebAssembly.
📖 В этой статье объясняется, как установить и использовать тулчейн Swift как вручную, так и с помощью инструмента командной строки под названием swiftenv (⭐1.9k на github).
@iOS Dev
7 способов передать замыкание в качестве аргумента в Swift
Рекомендую ознакомиться со следующим постом, если вы только сталкиваетесь с замыканиями:
📖 Для чего нужны closures (замыкания) в Swift и как с ними работать?
В самой iOS существует множество функций и методов, которые принимают замыкание в качестве одного из своих аргументов. Например, функции анимации:
или фильтра:
Существует несколько способов передать замыкание в эти функции.
📖 И об этих способах и пойдет речь в этом материале.
@iOS Dev
Рекомендую ознакомиться со следующим постом, если вы только сталкиваетесь с замыканиями:
📖 Для чего нужны closures (замыкания) в Swift и как с ними работать?
В самой iOS существует множество функций и методов, которые принимают замыкание в качестве одного из своих аргументов. Например, функции анимации:
class func animate(withDuration duration: TimeInterval,
animations: @escaping () -> Void)
или фильтра:
func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> [Self.Element]
Существует несколько способов передать замыкание в эти функции.
📖 И об этих способах и пойдет речь в этом материале.
@iOS Dev
5 советов по использованию брейкпоинтов, о которых вы могли не знать
Брейкпоинты в Xcode позволяют нам отлаживать и находить решения для неприятных ошибок. Без них это было бывеселым праздником свалкой
📖 В этом материале автор напоминает про следующие возможности:
🔘 Создание брейкпоинтов для всех проектов в Xcode (автоматически).
🔘 Шаринг брейкпоинтов через git.
🔘
🔘 Символические брейкпоинты (при вызове определённого метода). А также приводится пример для отладки проблем, связанных с
🔘
@iOS Dev
Брейкпоинты в Xcode позволяют нам отлаживать и находить решения для неприятных ошибок. Без них это было бы
print
в коде.📖 В этом материале автор напоминает про следующие возможности:
🔘 Создание брейкпоинтов для всех проектов в Xcode (автоматически).
🔘 Шаринг брейкпоинтов через git.
🔘
Exception breakpoints
c заданным действием отладчика.🔘 Символические брейкпоинты (при вызове определённого метода). А также приводится пример для отладки проблем, связанных с
UICollectionView
.🔘
Test failure breakpoint
(при сбое тестов).@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Как Airbnb применяет декларативное проектирование для быстрого создания плавных анимаций
ℹ️ Движение является ключевой частью того, что делает цифровой опыт простым и приятным в использовании.
Плавные переходы между состояниями и экранами являются ключом к тому, чтобы помочь пользователю сохранить контекст.
Быстрая анимация оживляет приложение и придает ему индивидуальность.
В Airbnb регулярно запускают сотни функций и экспериментов, разработанных инженерами из разных команд. При таком масштабе очень важно учитывать эффективность всего стека технологий.
⭐️ Добавление анимации должно быть быстрым и простым.
Если создание анимации занимает слишком много времени или ее слишком сложно интегрировать, то чаще всего её отбрасывают в первую очередь при переходе от дизайна к реализации.
📖 В этом материале инженер Airbnb рассказывает об опыте создания и использования кастомного фреймворка для реализации задуманных анимаций.
🛠А здесь находится сам epoxy.
@iOS Dev
ℹ️ Движение является ключевой частью того, что делает цифровой опыт простым и приятным в использовании.
Плавные переходы между состояниями и экранами являются ключом к тому, чтобы помочь пользователю сохранить контекст.
Быстрая анимация оживляет приложение и придает ему индивидуальность.
В Airbnb регулярно запускают сотни функций и экспериментов, разработанных инженерами из разных команд. При таком масштабе очень важно учитывать эффективность всего стека технологий.
Если создание анимации занимает слишком много времени или ее слишком сложно интегрировать, то чаще всего её отбрасывают в первую очередь при переходе от дизайна к реализации.
📖 В этом материале инженер Airbnb рассказывает об опыте создания и использования кастомного фреймворка для реализации задуманных анимаций.
🛠А здесь находится сам epoxy.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Пример работы с Apple Health: авторизация и сохранение данных
С разрешения пользователя приложения взаимодействуют с
📖 В этом коротком материале объясняется, как сохранить данные и информацию в Apple Health с помощью нескольких строк кода.
🛠 Пример приложения.
@iOS Dev
HealthKit
предоставляет центральный репозиторий данных о здоровье и физической форме на iPhone и Apple Watch. С разрешения пользователя приложения взаимодействуют с
HealthKit
для доступа к этим данным и обмена ими.📖 В этом коротком материале объясняется, как сохранить данные и информацию в Apple Health с помощью нескольких строк кода.
🛠 Пример приложения.
@iOS Dev
Подробное объяснение Enum с примерами кода в Swift
Конечно,
Все эти термины могут показаться вам знакомыми, если вы много работали с перечислениями.
Очень важно знать об этих возможностях, чтобы улучшить читабельность вашего кода, и, что более важно, чтобы уменьшить количество потенциальных ошибок.
📖 В этом материале на примерах объясняется, как именно можно использовать перечисление в тех или иных случаях.
ℹ️ Кстати, про 3 способа использования enum, которые должны быть в вашем арсенале, можно прочесть здесь.
@iOS Dev
Конечно,
Enum
широко используется в в Swift: If case
, guard case
, fallthrough
и протокол CaseIterable
. Все эти термины могут показаться вам знакомыми, если вы много работали с перечислениями.
Очень важно знать об этих возможностях, чтобы улучшить читабельность вашего кода, и, что более важно, чтобы уменьшить количество потенциальных ошибок.
📖 В этом материале на примерах объясняется, как именно можно использовать перечисление в тех или иных случаях.
ℹ️ Кстати, про 3 способа использования enum, которые должны быть в вашем арсенале, можно прочесть здесь.
@iOS Dev
Многопоточность в Swift
Подборка материалов для подготовки к собеседованиям
Ключевые темы этого поста: GCD (Grand Central Dispatch), Async/Await, Deadlock, Race Condition, Data race, Thread Explosion, Semaphore
🗒 Для удобства материалы разбиты на два блока, подборка будет дополняться по традиции с прошлым блоком:
🔗 Память, ссылки, side table и многое другое
🇷🇺 Материалы на русском языке
🔗 Многопоточность (concurrency) в Swift: GCD и Dispatch Queues
🔗 Concurrency в Swift, Operation и OperationQueue
🔗 Полное руководство по параллелизму и многопоточности в iOS
🔗 Про многопоточность: Thread и GCD
🔗 Structured concurrency в Swift
🔗 Многопоточность: Примитив синхронизации Semaphore🚦
🔗 Простое определение проблем многопоточки: Race Condition vs Data Race
🏴 Материалы на английском языке
🔗 Grand Central Dispatch: от определения к низкоуровневым примитивам
🔗 Grand Central Dispatch: многопоточность, очереди, параллелизм (две части)
🔗 Объяснение параллелизма: как создать многопоточное приложение для iOS
🔗 Swift Concurrency — вещи, о которых вам не говорят (и почему Actor - тихий убийца вашего кода, а Tasks - бутылочное горлышко)
🔗 Grand Central Dispatch (GCD) Tutorial in Swift 5 за авторством Вадима Булавина
🔗 Несложный блок вопросов в целом по Concurrency
Что почитать ещё?
🔗 Реализация API-клиента для работы с запросами в Swift с использованием Async/Await
🔗 Как приостановить Task в Swift?
🔗 Разбор вариантов рефакторинга в Xcode для async/await
🔗 Создание и планирование локальных уведомлений с помощью async/await
🔗 Async/await в Swift c примером использования на базе существующего проекта
🔗 Итерация сообщений веб-сокетов с помощью async / await в Swift
Лучшее спасибо — 👍❤️🔥👏🎉❤️🔥.
@iOS Dev — из этого канала кое-что точно можно сохранить себе😅
Подборка материалов для подготовки к собеседованиям
Ключевые темы этого поста: GCD (Grand Central Dispatch), Async/Await, Deadlock, Race Condition, Data race, Thread Explosion, Semaphore
🗒 Для удобства материалы разбиты на два блока, подборка будет дополняться по традиции с прошлым блоком:
🔗 Память, ссылки, side table и многое другое
🇷🇺 Материалы на русском языке
🔗 Многопоточность (concurrency) в Swift: GCD и Dispatch Queues
🔗 Concurrency в Swift, Operation и OperationQueue
🔗 Полное руководство по параллелизму и многопоточности в iOS
🔗 Про многопоточность: Thread и GCD
🔗 Structured concurrency в Swift
🔗 Многопоточность: Примитив синхронизации Semaphore🚦
🔗 Простое определение проблем многопоточки: Race Condition vs Data Race
🏴 Материалы на английском языке
🔗 Grand Central Dispatch: от определения к низкоуровневым примитивам
🔗 Grand Central Dispatch: многопоточность, очереди, параллелизм (две части)
🔗 Объяснение параллелизма: как создать многопоточное приложение для iOS
🔗 Swift Concurrency — вещи, о которых вам не говорят (и почему Actor - тихий убийца вашего кода, а Tasks - бутылочное горлышко)
🔗 Grand Central Dispatch (GCD) Tutorial in Swift 5 за авторством Вадима Булавина
🔗 Несложный блок вопросов в целом по Concurrency
Что почитать ещё?
🔗 Реализация API-клиента для работы с запросами в Swift с использованием Async/Await
🔗 Как приостановить Task в Swift?
🔗 Разбор вариантов рефакторинга в Xcode для async/await
🔗 Создание и планирование локальных уведомлений с помощью async/await
🔗 Async/await в Swift c примером использования на базе существующего проекта
🔗 Итерация сообщений веб-сокетов с помощью async / await в Swift
Лучшее спасибо — 👍❤️🔥👏🎉❤️🔥.
@iOS Dev — из этого канала кое-что точно можно сохранить себе😅
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Как поддерживать несколько виджетов при использовании WidgetKit?
Наличие нескольких виджетов с различными функциями в настоящее время является довольно распространенной функцией для приложений.
Например, в приложении для покупок может быть виджет, показывающий сегодняшнюю акцию, и другой виджет, показывающий статус заказа пользователя.
Я, например, в одном из своих приложений я использую комбинацию виджетов для отображения общих сбережений и избранных целей.
Опций у нас не так много, а на самом деле существует два способа включить в наших приложениях поддержку нескольких виджетов:
1️⃣ Использование widget bundle.
2️⃣ Наличие нескольких расширений.
📖 В этой статье рассматриваются оба этих метода по отдельности.
@iOS Dev —немного отдохнули, а теперь пора в 2023
Наличие нескольких виджетов с различными функциями в настоящее время является довольно распространенной функцией для приложений.
Например, в приложении для покупок может быть виджет, показывающий сегодняшнюю акцию, и другой виджет, показывающий статус заказа пользователя.
Я, например, в одном из своих приложений я использую комбинацию виджетов для отображения общих сбережений и избранных целей.
Опций у нас не так много, а на самом деле существует два способа включить в наших приложениях поддержку нескольких виджетов:
1️⃣ Использование widget bundle.
2️⃣ Наличие нескольких расширений.
📖 В этой статье рассматриваются оба этих метода по отдельности.
@iOS Dev —
ArraySlice с примерами использования: оператор range и prefix
Перед прочтением материала ниже попробуйте ответить:
📊 вот на этот вопрос
Стандартная библиотека Swift предоставляет
Получить первые несколько элементов коллекции можно с помощью использования
📖 В этой статье в прямом смысле наглядно объясняется, что на самом деле скрывает
@iOS Dev
Перед прочтением материала ниже попробуйте ответить:
📊 вот на этот вопрос
Стандартная библиотека Swift предоставляет
ArraySlice
для работы с подмножеством большей коллекции без ненужных расходов на создание копии. Получить первые несколько элементов коллекции можно с помощью использования
range
, но безопаснее использовать метод prefix
, не беспокоясь об исключении out of range
.📖 В этой статье в прямом смысле наглядно объясняется, что на самом деле скрывает
ArraySlice
и как избежать ошибок. @iOS Dev
10 различных способов реализации перебора в Swift
Один из самых важных элементов программирования, о котором большинство из нас не задумывается — это циклы.
Без них жизнь в мире программирования была бы почти невозможна.
📖 В этом материале приводится несколько коротких фрагментов кода, которые вы можете использовать для реализации: от простых к более сложным.
@iOS Dev
Один из самых важных элементов программирования, о котором большинство из нас не задумывается — это циклы.
Без них жизнь в мире программирования была бы почти невозможна.
📖 В этом материале приводится несколько коротких фрагментов кода, которые вы можете использовать для реализации: от простых к более сложным.
@iOS Dev