Неустранимая ошибка SwiftUI: Обнаружен объект ObservableObject типа - PullRequest
0 голосов
/ 19 апреля 2020

Мне нужна отдельная точка в моем приложении, где я могу хранить некоторые данные и быстро получать к ним доступ. До 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, поскольку для меня пользовательский сервис больше о выполнении некоторых функций (выборка пользовательских данных, обновление пользовательских данных на сервере, в локальном хранилище и et c), а не слой модели данных, который мы должны наблюдать. Запутался здесь вообще. В приведенной выше ссылке Павел использует это ObservableObject для настроек приложения, не уверен, что это правильно.
  3. В моем примере я пытаюсь получить пользователя с сервера и обновить пользователя в пользовательском сервисе после получения. это правильный или чистый разработанный код или я его обдумываю?

1 Ответ

2 голосов
/ 19 апреля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...