Неустранимая ошибка SwiftUI: объект типа ObservableObject не найден

Мне нужна единая точка в моем приложении, где я могу хранить некоторые данные и быстро получать к ним доступ. До SwiftUI у меня просто былоApplicationDelegateдля этого. Раньше мне просто нужно было позвонитьappDelegate.userServiceи он предоставляет мне единую точку в приложении, которая была инициализирована один раз. Никаких синглтонов, просто appDelegate.

Теперь я нашел этот учебник, как использовать@EnvironmentObject

Я добавил сюда этот код, чтобы запустить свой userService:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?
    var userService = UserService() 

...

Также у меня есть этот код на мой взгляд:

struct LoginView: View {

    @EnvironmentObject var userService: UserService

    var body: some View {

...

В приведенном выше LoginView У меня есть функция для получения пользователя с сервера по электронной почте:

func fetchUser(with email: String) {

        userService.getUser(with: email) { (result) in
            switch result {
            case .success(let user):
                self.userService.user = user // update user in user service after fetch
                self.showWelcomeView = true
                break
            case .failure:
                break
            }

            self.showActivityIndicator = false
        }
    }

Но когда я пытаюсь позвонить getUser функция я получаю эту ошибку:

Fatal error: No ObservableObject of type UserService found.
A View.environmentObject(_:) for UserService may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-39.4.3/Core/EnvironmentObject.swift, line 55
2020-04-18 23:52:41.774988+0300 BusinessTool[7426:730172] Fatal error: No ObservableObject of type UserService found.
A View.environmentObject(_:) for UserService may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-39.4.3/Core/EnvironmentObject.swift, line 55

Вот моя пользовательская служба:

class UserService: ObservableObject {

    enum UserFetchResult {
        case success(data: User)
        case failure
    }

    typealias UserServiceResponse = (User?, NSError?) -> Void

    @Published var user = User(username: "", email: "")
...

Главный вопрос - как решить вышеуказанный вопрос?

Еще у меня есть побочные вопросы:

  1. Мне нужно настроить этот одноэлементный объект среды (@EnvironmentObject) или лучше использовать AppDelegate как раньше appDelegate.userService и хранить там все необходимые данные, плюсов в этой штуке не вижу.
  2. Если есть какие-то преимущества, мне нужно сделать пользовательский сервис как ObservableObjectдля меня пользовательский сервис - это скорее выполнение некоторых функций (выборка пользовательских данных, обновление пользовательских данных на сервере, в локальном хранилище и т. д.), а не уровень модели данных, который нам нужно наблюдать. Напутал вообще тут. В приведенной выше ссылке Пол использует этоObservableObject для настроек приложения, не уверен, что это правильно.
  3. В моем примере я пытаюсь получить пользователя с сервера и обновить пользователя в пользовательской службе после получения, это правильный или чистый разработанный код, или я слишком много над ним думаю?

1 ответ

Решение

В твоем SceneDelegate ты должен позвонить .environmentObject(userService) в корневом представлении (LoginView).

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