Я использую @MainActor с классом модели представления, как показано в приведенном ниже коде, когда я пытался добавить ключ среды для модели, появляется следующая ошибка: «Вызов инициализатора init(), изолированного от главного субъекта, в синхронном неизолированном контексте» и код не компилируется, пока я не удалю @MainActor из класса. Возможно ли использовать как @MainActor, так и EnvironmentKey для одного и того же класса.
Посмотреть класс модели:
extension HomeView {
@MainActor
internal final class ViewModel: ObservableObject {
// More code here...
}
}
EnvironmentKey для модели представления:
struct HomeViewModelKey: EnvironmentKey {
static var defaultValue = HomeView.ViewModel()
}
extension EnvironmentValues {
var homeViewModel: HomeView.ViewModel {
get { self[HomeViewModelKey.self] }
set { self[HomeViewModelKey.self] = newValue }
}
}
Я знаю, я хочу читать изменение значения, а не наблюдать за ним.
Вы можете использовать .environmentObject(Store.shared)
для объекта вашего магазина, который загружает структуры модели в свойства @Published
. Обычно это синглтон .shared
с еще одним синглтоном для предпросмотра .preview
.
Я хочу избежать использования «@ObservedObject» или «@EnvironmentObject», потому что каждый раз, когда вы их используете, я создаю зависимость от некоторых внешних данных.
Это для данных модели да. Для просмотра данных мы используем @State.
Да, но я хочу передать одно свойство представлению без использования "@ObservedObject" или "@EnvironmentObject" .
Просто используйте let
для доступа для чтения или @Binding var
для доступа для записи.
Спасибо за ответ, но я хочу использовать @MainActor с EnvironmentKey.
Пробовали ли вы добавить атрибут основного актера в свойства ключа вашей среды следующим образом?:
Просмотр класса модели:
extension HomeView {
@MainActor
internal final class ViewModel: ObservableObject {
// More code here...
}
}
EnvironmentKey для модели представления:
struct HomeViewModelKey: EnvironmentKey {
@MainActor
static var defaultValue = HomeView.ViewModel()
}
extension EnvironmentValues {
@MainActor
var homeViewModel: HomeView.ViewModel {
get { self[HomeViewModelKey.self] }
set { self[HomeViewModelKey.self] = newValue }
}
}
Спасибо за ответ, теперь код компилируется.
Ценности среды не смогут отслеживать изменения