Разработка
Поваренная книга SwiftUI: использование Combine с SwiftUI для управления состояниями
Combine — это функциональный фреймворк реактивного программирования от Apple. Он предоставляет декларативный Swift API для длящейся обработки значений. Эти значения могут представлять собой события пользовательского интерфейса, сетевые ответы, события по расписанию и многие другие виды асинхронных данных.
При использовании со SwiftUI Combine помогает писать чистый, реактивный код, реагирующий на изменения состояния во времени. В основе Combine лежат издатели и подписчики: издатели издают события, а подписчики прослушивают эти события.
Примечание: В этом примере используется жестко заданный список шуток. В реальном приложении вы замените его сетевым кодом для получения шуток с сервера.
Получение шуток: пример
В этом примере вы создадите простое приложение, которое будет получать случайную шутку из API при каждом нажатии на кнопку. Вы будете использовать Combine для работы с сетью и SwiftUI для отображения результата.
import SwiftUI import Combine struct ContentView: View { @StateObject private var jokeFetcher = JokeFetcher() var body: some View { VStack { Text(jokeFetcher.joke) .padding() Button("Fetch Joke") { jokeFetcher.fetchJoke() } } .onAppear { jokeFetcher.fetchJoke() } } } class JokeFetcher: ObservableObject { @Published var joke: String = "" private var cancellable: AnyCancellable? private let jokes = [ "Why don't scientists trust atoms? Because they make up everything!", "Why did the bicycle fall over? Because it was two tired!", "Why don't some animals play cards? Because they are afraid of cheetahs!", "Why did the scarecrow win an award? Because he was outstanding in his field!" ] func fetchJoke() { // Networking code here // Update `joke` with the result if let randomJoke = jokes.randomElement() { joke = randomJoke } } deinit { cancellable?.cancel() } }
В приведенном выше коде:
JokeFetcher
— этоObservableObject
, который имитирует получение шутки из API. У него есть@Published
свойствоjoke
, которое хранит полученную шутку. Каждый раз, когда шутка обновляется, SwiftUI автоматически запускает обновление пользовательского интерфейса.fetchJoke()
— это метод, который случайным образом выбирает шутку из массиваjokes
и присваивает ее свойствуjoke
.- В
ContentView
объектJokeFetcher
создается с помощью обертки свойства@StateObject
, благодаря чему объект создается только один раз и сохраняется при всех обновлениях представления. - Представление
Text
используется для отображения шутки, а кнопкаButton
запускает выборку новой шутки при нажатии. - Модификатор
onAppear
используется для получения шутки при первом появлении представления, что гарантирует отображение шутки при запуске приложения.
Ваш предварительный просмотр должен выглядеть следующим образом:
Подводя итог, можно сказать, что Combine — это мощный фреймворк, который может значительно упростить управление состояниями в SwiftUI. Интегрировав Combine с ObservableObject
и StateObject
в SwiftUI, вы сможете создавать динамичные и реактивные пользовательские интерфейсы, которые с легкостью обрабатывают сложные асинхронные события.
← Предыдущая статья: Шаринг состояний между представлениями с помощью объектов окружения