Эффективное управление состояниями — ключ к созданию стабильных и отзывчивых приложений в SwiftUI. Ниже приведены некоторые лучшие практики управления состоянием в ваших приложениях SwiftUI:
- Используйте State и Binding для простых локальных состояний.
State
иBinding
идеально подходят для управления простым состоянием, которое локально для представления или может быть передано от родительского представления к дочернему. Помните, что эти обертки свойств предназначены для работы с типами значений. - Для сложных состояний используйте ObservedObject и Published. Если у вас есть более сложное состояние, которое может быть общим для нескольких представлений, рассмотрите возможность использования
ObservedObject
иPublished
в сочетании с отдельным классом управления состоянием. - Используйте EnvironmentObject для совместного использования состояния в несвязанных представлениях. Если вам нужно разделить состояние между несколькими представлениями, которые не связаны напрямую через отношения родитель-ребенок,
EnvironmentObject
может быть хорошим выбором. - Избегайте больших State переменных. Хранение большого количества данных в
State
переменных может привести к проблемам с производительностью, поскольку SwiftUI пересоздает представление при каждом изменении состояния. - Отложите сложные вычисления и побочные эффекты. Избегайте выполнения сложных вычислений или побочных эффектов, например сетевых запросов, непосредственно в структурах представления.
Давайте проиллюстрируем эти лучшие практики на примере простого приложения менеджера задач:
class TaskManager: ObservableObject { @Published var tasks = [String]() func addTask(_ task: String) { tasks.append(task) } } struct TaskListView: View { @EnvironmentObject var taskManager: TaskManager @State private var newTask = "" var body: some View { NavigationStack { VStack { TextField("New task", text: $newTask) .onSubmit { if !newTask.isEmpty { taskManager.addTask(newTask) newTask = "" } } .padding() List(taskManager.tasks, id: \.self) { task in Text(task) } } .navigationTitle("Task List") } } } struct ContentView: View { @StateObject var taskManager = TaskManager() var body: some View { TaskListView() .environmentObject(taskManager) } }
Ваш предварительный просмотр должен выглядеть следующим образом:
В этом примере вы создаете класс TaskManager
, который управляет списком задач. Это ObservableObject
, что означает, что SwiftUI будет следить за изменениями его свойств Published
и обновлять все представления, которые зависят от этих свойств. TaskListView
использует EnvironmentObject
для доступа к общему TaskManager
и State
для свойства newTask
, которое является локальным для этого представления. Когда в текстовом поле фиксируется новая задача, она добавляется в диспетчер задач, а текстовое поле очищается.
← Предыдущая статья: Создание и доступ к переменным окружения в SwiftUI