我希望在我的应用程序中有一个点可以存储一些数据并快速访问它。在SwiftUI之前,我只是使用ApplicationDelegate
来实现此目的。在我只需要调用一种appDelegate.userService
之前,它为我提供了一次初始化的应用程序中的单个点。 appDelegate根本没有更多的单例。
现在我找到了tutorial的@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.userService
一样使用AppDelegate并将所有需要的数据存储在那里,我看不出这样做的任何优势事情。ObservableObject
的身份进行用户服务,因为我的用户服务更多是关于执行某些功能(获取用户数据,更新服务器上,本地存储中的用户数据以及等),而不是我们需要观察的数据模型层。这里很困惑。在上面我提供的链接中,Paul使用ObservableObject
进行应用设置,不确定是否正确。答案 0 :(得分:2)
在您的SceneDelegate
中,应在根视图(.environmentObject(userService)
)上调用LoginView
。