SwiftUI с использованием @MainActor с EnvironmentKey

Я использую @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 }
  }
}

Ценности среды не смогут отслеживать изменения

lorem ipsum 05.12.2022 20:55

Я знаю, я хочу читать изменение значения, а не наблюдать за ним.

Ammar Ahmad 07.12.2022 16:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
88
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать .environmentObject(Store.shared) для объекта вашего магазина, который загружает структуры модели в свойства @Published. Обычно это синглтон .shared с еще одним синглтоном для предпросмотра .preview.

Я хочу избежать использования «@ObservedObject» или «@EnvironmentObject», потому что каждый раз, когда вы их используете, я создаю зависимость от некоторых внешних данных.

Ammar Ahmad 18.11.2022 04:55

Это для данных модели да. Для просмотра данных мы используем @State.

malhal 18.11.2022 10:03

Да, но я хочу передать одно свойство представлению без использования "@ObservedObject" или "@EnvironmentObject" .

Ammar Ahmad 18.11.2022 15:51

Просто используйте let для доступа для чтения или @Binding var для доступа для записи.

malhal 18.11.2022 16:01

Спасибо за ответ, но я хочу использовать @MainActor с EnvironmentKey.

Ammar Ahmad 19.11.2022 18:40
Ответ принят как подходящий

Пробовали ли вы добавить атрибут основного актера в свойства ключа вашей среды следующим образом?:

Просмотр класса модели:

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 }
    }
}

Спасибо за ответ, теперь код компилируется.

Ammar Ahmad 07.12.2022 16:47

Другие вопросы по теме