带有完成处理程序输出的 PassthroughSubject?

PassthroughSubject with completion handler output?

我刚刚开始使用 Combine。对于这种情况,我有以下问题:

  1. 是否接受将元组作为 PassthroughSubject 输出?
  2. 是否接受将完成处理程序作为 PassthroughSubject 输出的一部分?

示例情况:

SwiftUI 登录视图,我将登录切换到另一个 class 并期待返回结果:

struct LogInView: View {
    var loginSubject = PassthroughSubject<(username: String, password: String, completion: (Error?) -> Void), Never>()         

    var body: some View {
        Button {
            loginSubject.send((username: "Jim", password: "qwerty123", completion: { error in
                if let error = error {
                    // handle error
                } else {
                    // navigate to app
                }
            }))
        } label: {
            Text("Log in")
        }
    }
}

我想知道这种情况的其他可能解决方案(由于 'LogInView' 在 SwiftUI 视图中,我无法直接使用 'login helper' class包和 'log in helper' 在主应用程序中)and/or 如果这将被普遍接受为解决方案。

  1. 是的,很常见。
  2. 不,使用这样的完成处理程序不利于 Combine 的内置完成处理。与其使用 passthrough,不如使用一个函数来获取用户名和密码并生成发布者,订阅该发布者将为您提供 completion/output 处理。这样的函数通常存在于 ObservableObject 中,您将其作为 @EnvironmentObject.
  3. 注入到视图层次结构中

进一步阅读:https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-environmentobject-to-share-data-between-views