@StateObject vs @observedObject при прохождении извне, но принадлежит представлениюIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 @StateObject vs @observedObject при прохождении извне, но принадлежит представлению

Сообщение Anonymous »

На основе этого ответа: в чем разница между ObservedObject и StateObject в SwiftUI
И код документации 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)
}
}
На основе этой статьи: https://www.hackingwithswift.com/quick- ... mentobject
Между @StateObject и @ObservedObject есть одно важное различие: право собственности: какое представление создало объект, а какое просто наблюдает за ним.
Правило такое: какое бы представление ни создало ваш объект первым, оно должно использовать @StateObject, чтобы сообщить SwiftUI, что оно является владельцем данных и отвечает за их поддержание. Все остальные представления должны использовать @ObservedObject, чтобы сообщить SwiftUI, что они хотят отслеживать изменения объекта, но не владеют им напрямую.
Похоже, что если представление для создания экземпляра ViewModel, его необходимо объявить с помощью @StateObject. Мой код очень похож, с той лишь разницей, что ViewModel создается в другом месте, но View "владеет" им после инициализации.

Подробнее здесь: https://stackoverflow.com/questions/710 ... y-the-view
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»