Hacker News, чей API
мы собираемся использовать в этой статье, является социальным сайтом, сфокусированным на компьютерах и предпринимательстве. Если вы с ним ещё не знакомы, то вы найдёте там много интересного.
В предыдущих статьях на примере базы данных фильмов TMDb и агрегатора новостей NewsAPI.org была представлена стратегия применения Combine
для формирования HTTP
запросов и использования их во View Model
для управления UI
, спроектированного с помощью SwiftUI
. В этой статье мы в точности воспроизведем ту же самую стратегию для разработки приложения, взаимодействующего с агрегатором новостей Hacker News, но добавим работу с «внешним» издателем Timer
и для простоты исключим обработку ошибок.
Надо сказать, что выборка статей на ресурсе Hacker News имеет совершенно другую логику, чем в новостном агрегаторе NewsAPI.org, но технология, основанная на выполнении HTTP запросов с помощью Combine
, прекрасно показывает свою гибкость и в этой ситуации. Кроме того, информация там очень часто обновляется и использование внешнего «издателя» Timer
в View Model
для изменения UI
в SwiftUI
позволит автоматически отслеживать поступающие на сайт новые истории (Story
), именно так их называют на этом ресурсе.
API
агрегатора новостей Hacker News можно использовать совершенно свободно и не требуется никакой регистрации для аккаунта разработчика. Это здорово, потому что вы можете сразу начать работать над кодом без длительной регистрации, как мы делали это с другими public APIs
.
Наша стратегия состоит в том, что мы создаём с помощью Combine
«издателей» Publisher
для выборки данных из интернета, на которые затем «подписываемся» в ObservableObject
классах с @Published
свойствами, изменения которых SwiftUI
АВТОМАТИЧЕСКИ отслеживает и полностью «перерисовывает» свои View
.
В эти ObservableObject
классы мы закладываем определенную бизнес-логику приложения, пользуясь тем, что некоторые из этих @Published
свойств могут напрямую меняться либо такими «активными» элементами пользовательского интерфейса (UI
) как текстовые поля TextField
, Picker
, Stepper
, Toggle
, либо с помощью внешних «издателей» типа Timer
, а другие @Published
свойства, напротив, могут быть «пассивными», являясь результатом синхронных и/ или асинхронных преобразований «активных» @Published
свойств, но именно они то нас чаще всего и интересуют. Зависимость «пассивных» от «активных» @Published
свойств очень просто описываем с помощью Combine
в ObservableObject
классах, которые выступают в роли View Model
для управления UI
в SwiftUI
.
Отличительной особенностью приложения, представленное в этой статье, является то, что обновление новостного контента будет происходить АВТОМАТИЧЕСКИ без участия пользователя, благодаря внешнему «издателю» Timer
. Для того, чтобы сосредоточиться исключительно на этом, UI
приложения будет максимально упрощен: он не будет содержать никаких «картинок» (images
), кроме того не будет возможности детального исследования историй. Зато время, прошедшее с момента появления истории на сайте Hacker News, будет постоянно обновляться. Поступление каждой новой истории будет оперативно отражаться на UI
и сопровождаться звуковым сигналом.