@State vs @ObservableObject - что и когда? - PullRequest
0 голосов
/ 22 апреля 2020

В настоящее время я знакомлюсь с платформами SwiftUI и Combine. И я не очень понимаю разницу между этими двумя подходами. Когда нам нужно отслеживать некоторые данные (скажем, список задач), мы можем объявить переменную @State, и ее изменение автоматически отправит уведомление и обновит текущее представление. Однако, похоже, что это также можно сделать следующим образом:

class TaskList: ObservableObject{
    //a list that's going to be modified and updated on different occasions
    @Published var list: [String]
}

class TodoListView {
    @ObservedObject var todoList = TaskList()
}

Итак, я упустил точку - Чем отличаются подходы @State и @ObservedObject и какой предпочтительнее при каких обстоятельствах?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 апреля 2020

Если вы пометите какие-либо переменные как @State в SwiftUI View и свяжете их со свойством внутри body этого View, body будет пересчитываться при каждом изменении переменной @State и следовательно, все ваше View будет перерисовано. Кроме того, переменные @State должны служить единственным источником истины для View. По этим причинам переменные @State должны быть доступны и обновлены только в пределах body из View и, следовательно, должны быть объявлены private.

Вы должны использовать @State, когда вы связываете некоторый пользовательский ввод (например, значение TextField или выбранное значение из Picker).

С другой стороны, свойства @ObservedObject не обновляют body View автоматически они просто отправляют значение через своего издателя при каждом изменении значения.

Вам следует использовать @ObservedObject, если у вас есть какие-то данные, поступающие извне вашего View, например, в архитектуре MVVM с SwiftUI ваш ViewModel должен храниться как @ObservedObject на вашем View.

2 голосов
/ 22 апреля 2020

Основное отличие состоит в том, что @State для структур, а @ObservedObject для классов. И @State, и @ObservedObject достигают схожей вещи, обновляя вас, когда что-то меняется.

A struct изменяется, когда какое-то свойство изменено, что означает, что оно воссоздается, поэтому @State обновляется. A class обновляет @ObservedObject при изменении свойства - используя @Published для прослушивания изменений. Когда обновляется либо @State, либо @ObservedObject, тело представления переделывается.

Здесь вы действительно задаете вопрос , когда использовать struct против класса , если любой из них будет работать в некоторых ситуациях.

В вашем случае, поскольку TaskList является только базовой c структурой данных и не требует большого количества свойств, которые вы хотите предотвратить, чтобы обновить представление (используя / не используя @Published), вам, вероятно, следует использовать struct с @State вместо.

...