Ios 在WindowGroup中处理身份验证状态
我还是SwiftUI新手,不知道如何最好地处理身份验证状态。例如,如果一个用户登录,我想将他重定向到主屏幕,如果不是某个屏幕 我有一个服务可以告诉我用户是否经过身份验证,比如:Ios 在WindowGroup中处理身份验证状态,ios,swift,swiftui,Ios,Swift,Swiftui,我还是SwiftUI新手,不知道如何最好地处理身份验证状态。例如,如果一个用户登录,我想将他重定向到主屏幕,如果不是某个屏幕 我有一个服务可以告诉我用户是否经过身份验证,比如:self.authService.isAuthenticated,但在WindowGroup中的我的应用程序中,我不能使用我的服务,因为这都是一个结构,我得到的不能对不可变值使用变异getter:“self”是不可变的 如果能给我一个小片段来帮助我解决这个问题,我将不胜感激 我的代码: @main struct MyApp
self.authService.isAuthenticated
,但在WindowGroup中的我的应用程序中,我不能使用我的服务,因为这都是一个结构,我得到的不能对不可变值使用变异getter:“self”是不可变的
如果能给我一个小片段来帮助我解决这个问题,我将不胜感激
我的代码:
@main
struct MyApp: App, HasDependencies {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
// MARK: Services
private lazy var authService: AuthService = dependencies.authService()
var body: some Scene {
WindowGroup {
if !self.authService.isAuthenticated {
WelcomeView()
} else {
MainView()
}
}
}
}
我想您现在只想处理它,但我建议您更深入地研究SwiftUI绑定和状态处理。 因此,这里我们只是将值保存在init中的一个变量中,因为这是首先加载的
@main
struct MainApp: App, HasDependencies {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
// MARK: Services
private lazy var authService: AuthService = dependencies.authService()
var isAuth: Bool = false
init() {
isAuth = self.authService.isAuthenticated
}
var body: some Scene {
WindowGroup {
if isAuth {
MainView()
} else {
WelcomeView()
}
}
}
}
我想您现在只想处理它,但我建议您更深入地研究SwiftUI绑定和状态处理。 因此,这里我们只是将值保存在init中的一个变量中,因为这是首先加载的
@main
struct MainApp: App, HasDependencies {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
// MARK: Services
private lazy var authService: AuthService = dependencies.authService()
var isAuth: Bool = false
init() {
isAuth = self.authService.isAuthenticated
}
var body: some Scene {
WindowGroup {
if isAuth {
MainView()
} else {
WelcomeView()
}
}
}
}
问题是
private lazy var authService: AuthService = dependencies.authService()
(A) SwiftUI重建视图以响应例如@StateObject
的对象WillChangePublisher
。更改一个不受监视的变量会静默地落在林中,而不参与此UI框架,但如果您触发其他对象的状态更改,则会被读取。另外,我猜每次构建结构时都会重建服务,但我还没有这个场景的用例,所以我不知道
(B) 您有一个变异变量,它持有一个存储在值类型中的引用类型。如上所述,将您的服务存储为@StateObject
,这是SwiftUI解决生命周期管理问题的一种方法
要获得“惰性”加载,请调用.onAppear{service.load()}
也就是说,您有一个服务/工厂容器,您可能已经想成为@StateObject
,并将其注入到环境中。如果将可观察对象
存储在可观察对象
中,则视图将仅对外部对象作出反应。该对象不会将其ObjectWillChangePublisher链接到内部对象。您需要:
(a) 单独向环境中注入精选服务,供儿童观察
(b) 将它们传递到可观察的视图模型中,这些模型使用Combine订阅特定状态
(c) 在视图上使用.onReceive
和.onChange
API链接到特定的状态更改
(C) 应用程序中计算的条件可能会导致重新生成存储在该结构中的对象。好的做法是像往常一样保持应用程序超级干净。将任何条件逻辑移动到该场景的“根”视图。问题在于
private lazy var authService: AuthService = dependencies.authService()
(A) SwiftUI重建视图以响应例如@StateObject
的对象WillChangePublisher
。更改一个不受监视的变量会静默地落在林中,而不参与此UI框架,但如果您触发其他对象的状态更改,则会被读取。另外,我猜每次构建结构时都会重建服务,但我还没有这个场景的用例,所以我不知道
(B) 您有一个变异变量,它持有一个存储在值类型中的引用类型。如上所述,将您的服务存储为@StateObject
,这是SwiftUI解决生命周期管理问题的一种方法
要获得“惰性”加载,请调用.onAppear{service.load()}
也就是说,您有一个服务/工厂容器,您可能已经想成为@StateObject
,并将其注入到环境中。如果将可观察对象
存储在可观察对象
中,则视图将仅对外部对象作出反应。该对象不会将其ObjectWillChangePublisher链接到内部对象。您需要:
(a) 单独向环境中注入精选服务,供儿童观察
(b) 将它们传递到可观察的视图模型中,这些模型使用Combine订阅特定状态
(c) 在视图上使用.onReceive
和.onChange
API链接到特定的状态更改
(C) 应用程序中计算的条件可能会导致重新生成存储在该结构中的对象。好的做法是像往常一样保持应用程序超级干净。将任何条件逻辑移动到该场景的“根”视图。您还没有显示调试该场景所需的所有代码,但一般来说,您的AuthService应该是一个可以监视更改的
可观察对象。您还没有显示调试该场景所需的所有代码,但一般来说,我想说,你的AuthService应该是一个可观察对象,你可以观察它的变化。isAuth
在这种情况下永远不会更新,对吗?因为这是在主应用程序中,只有在应用程序启动时才会调用它…所以如果用户进行了身份验证,他们必须关闭并重新打开应用程序才能在UI中生效。这是主要的应用程序部分,其他屏幕中发生的事情在这里不是必需的,正如我所看到的。这取决于@Muli来决定…@jnpdx你对这种情况有答案吗?isAuth
在这种情况下永远不会更新,对吗?因为这是在主应用程序中,只有在应用程序启动时才会调用它…所以如果用户通过身份验证,他们必须关闭并重新打开应用程序才能在UI中生效。这是主要的应用程序部分,其他屏幕中发生的事情在这里不是必需的,正如我所看到的。这取决于@Muli来决定…@jnpdx你对这个案例有什么答案吗?我会记住所有这些,thnx,但我现在的解决方案是@FBCI的答案,thnx,我现在的解决方案是@FBC的答案