И код документации Apple здесь: https://developer.apple.com/documentation/swiftui/ управление данными-модели-в-вашем-приложении
В приложении SwiftUI следует использовать оболочку свойства @StateObject, когда представление создает экземпляр самого объекта, так, чтобы объект не будет воссоздан во время обновления представления.
Если объект создается где-то еще, вместо него следует использовать оболочку @ObservedObject.
Однако есть тонкая грань, которая делает это немного неясным: что, если экземпляр объекта создается где-то еще, но «вводится» в представление, а затем представление является единственным владельцем / держателем этого объекта ? Должен ли это быть @StateObject или @ObservedObject?
Пример кода, чтобы проиллюстрировать суть:
Код: Выделить всё
import SwiftUI
import Combine
import Foundation
struct ViewFactory {
func makeView() -> some View {
let viewModel = ViewModel()
return NameView(viewModel)
}
}
final class ViewModel: ObservableObject {
@Published var name = ""
init() {}
}
struct NameView: View {
// Should this be an `@ObservedObject` or `@StateObject`?
@ObservedObject var viewModel: ViewModel
init(_ viewModel: ViewModel) {
self.viewModel = viewModel
}
var body: some View {
Text(viewModel.name)
}
}
Между @StateObject и @ObservedObject есть одно важное различие: право собственности: какое представление создало объект, а какое просто наблюдает за ним.
Правило такое: какое бы представление ни создало ваш объект первым, оно должно использовать @StateObject, чтобы сообщить SwiftUI, что оно является владельцем данных и отвечает за их поддержание. Все остальные представления должны использовать @ObservedObject, чтобы сообщить SwiftUI, что они хотят отслеживать изменения объекта, но не владеют им напрямую.
Похоже, что если представление для создания экземпляра ViewModel, его необходимо объявить с помощью @StateObject. Мой код очень похож, с той лишь разницей, что ViewModel создается в другом месте, но View "владеет" им после инициализации.
Подробнее здесь: https://stackoverflow.com/questions/710 ... y-the-view