Взгляд на новую функцию параллельного языка в 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 для его вызова выглядит так.

Вы можете найти все это на битбакете в рамках этого проекта. Все это подводит меня к концу этого произведения. Это еще не все.