Неустранимая ошибка 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: "")
...
Главный вопрос - как решить вышеуказанный вопрос?
Еще у меня есть побочные вопросы:
- Мне нужно настроить этот одноэлементный объект среды (
@EnvironmentObject
) или лучше использовать AppDelegate как раньшеappDelegate.userService
и хранить там все необходимые данные, плюсов в этой штуке не вижу. - Если есть какие-то преимущества, мне нужно сделать пользовательский сервис как
ObservableObject
для меня пользовательский сервис - это скорее выполнение некоторых функций (выборка пользовательских данных, обновление пользовательских данных на сервере, в локальном хранилище и т. д.), а не уровень модели данных, который нам нужно наблюдать. Напутал вообще тут. В приведенной выше ссылке Пол использует этоObservableObject
для настроек приложения, не уверен, что это правильно. - В моем примере я пытаюсь получить пользователя с сервера и обновить пользователя в пользовательской службе после получения, это правильный или чистый разработанный код, или я слишком много над ним думаю?
1 ответ
В твоем SceneDelegate
ты должен позвонить .environmentObject(userService)
в корневом представлении (LoginView
).