Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在WindowGroup中处理身份验证状态_Ios_Swift_Swiftui - Fatal编程技术网

Ios 在WindowGroup中处理身份验证状态

Ios 在WindowGroup中处理身份验证状态,ios,swift,swiftui,Ios,Swift,Swiftui,我还是SwiftUI新手,不知道如何最好地处理身份验证状态。例如,如果一个用户登录,我想将他重定向到主屏幕,如果不是某个屏幕 我有一个服务可以告诉我用户是否经过身份验证,比如:self.authService.isAuthenticated,但在WindowGroup中的我的应用程序中,我不能使用我的服务,因为这都是一个结构,我得到的不能对不可变值使用变异getter:“self”是不可变的 如果能给我一个小片段来帮助我解决这个问题,我将不胜感激 我的代码: @main struct MyApp

我还是SwiftUI新手,不知道如何最好地处理身份验证状态。例如,如果一个用户登录,我想将他重定向到主屏幕,如果不是某个屏幕

我有一个服务可以告诉我用户是否经过身份验证,比如:
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的答案