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