Взгляд на новую функцию параллельного языка в iOS 15
На прошлой неделе я опубликовал статью о новой языковой функции в Swift 5.5, специально разработанной для параллельного кодирования. В конце этой статьи я сказал, что было больше, совсем немного больше.
Присоединяйтесь ко мне на эту тему, чтобы узнать больше об асинхронных последовательностях в Swift 5.5. Кто они такие? Как вы их используете? И как вы можете внедрить их в свой код уже сегодня.
Кодировать
Я хочу начать с глобального потепления, и почему бы и нет. Вы можете скачать некоторые интересные данные по этому вопросу с этого веб-сайта — сайта, на котором я нашел таблицу, показывающую, как средняя температура земли выросла на 1 градус за последние 100 лет.
Чтение файла
Итак, план состоит в том, чтобы прочитать файл с моими данными о температуре, отображая при этом гистограмму — то, что раньше не было возможно в Swift. Обычно мне нужно было прочитать данные, а затем отобразить их — теперь я могу использовать некоторые новые функции языка для отображения данных по мере их чтения.
Бон — я создал две функции, которые запускаю в основном потоке, причина ошибки @MainActor
. Цикл считывает файл temps
по одной строке за раз. Прочитав его, он разбивает содержимое (это csv), а затем публикует его в интерфейсе SwiftUI. Обратите внимание на ключевые слова async и await. Да, я использую платформу Combine.
Затем интерфейс SwiftUI для этого кода с функцией запуска, которую нам нужно вызвать в задаче, опять же с ключевым словом await.
Он анализирует отправленные значения и использует каждое из них для рисования нового столбца на гистограмме — конечный результат выглядит следующим образом. Да, я знаю, что заголовок поднимается по мере приближения к концу — это казалось уместным.
Сетевой поток
Хорошо — это ценно, но ограничено — В конце концов, кто хранит вещи в файлах на самом устройстве? Вот второй пример получения входных данных из асинхронного потока.
Теперь настроить это действительно очень просто. Вы определяете конечную точку, где я буду использовать локальный хост, а затем запускаю локальный веб-сервер на своем Mac для подключения к нему.
Веб-сервер поставляется с OS X. Сервер, который я запускаю с помощью этой командной строки в сеансе терминала.
sudo apachectl start
Вы можете проверить, работает ли ваш веб-сервер, открыв браузер по адресу локального хоста 127.0.0.1. Он должен вернуться со страницей с надписью «Это работает!». После этого попробуйте запустить код, который я только что процитировал, в своем приложении. Вы должны получить сообщение на консоли, в котором говорится об этом.
event <html><body><h1>It works!</h1></body></html>
Очевидно, протестировав его, я настоятельно рекомендую вам не оставлять его включенным, на всякий случай — замените start на stop, чтобы сделать это.
Пользовательский поток
Бон — давайте сделаем что-то немного другое — давайте создадим собственное соединение асинхронного типа. Это может показаться немного диким и экзотическим, хотя, если подумать, большая часть данных, которые вы получаете, например, от датчиков, поступает в виде потоков.
На этот раз начнем с картинки. Вот короткая демонстрация, чтобы показать вам, куда мы идем. Его, конечно, не слышно, но похоже, когда я читаю цифры от одного до десяти (немного ускоренно).
И это код, стоящий за этим.
А это — код раздела SwiftUI, который его вызывает.
В этом коде я определяю асинхронный метод doAudio, который выполняется как бесконечная задача. Я запускаю в нем цикл for next, который возвращает все элементы в потоке каждые 0,02 секунды (аудио производит горы данных). Я запускаю таймер, чтобы очистить массив значений, которые я регистрирую, что дает такой эффект прокрутки.
Затем я использовал ту же логику рисования гистограммы, что и раньше, за исключением того, что я создал структуру, так как цикл for-next, поскольку swift требует, чтобы каждый возвращаемый элемент был уникальным.
Конечно, это не включает в себя полный код, настройку аудиосвязи — чтобы получить все это в одном файле, проверьте битбакет здесь.
Пользовательский менеджер
В этом примере я создал motionManager
, который я использую для передачи данных в асинхронную последовательность. Затем я использую асинхронную последовательность, чтобы вернуть эти данные в виде массива. Я использовал актера, чтобы гарантировать, что мой доступ к извлечению этих данных и их очистке был управляемым.
Затем я использую данные для смещения трех кругов, которые я раскрасил красным, зеленым и синим, чтобы получить эффект, который вы видите здесь. Запись реального устройства; очевидно, вы не можете запустить это на симуляторе.
Тип актора с кодом детектора движения выглядит так.
И код SwiftUI для его вызова выглядит так.
Вы можете найти все это на битбакете в рамках этого проекта. Все это подводит меня к концу этого произведения. Это еще не все.