【问题标题】:PassthroughSubject with completion handler output?带有完成处理程序输出的 PassthroughSubject?
【发布时间】:2021-09-13 23:27:14
【问题描述】:

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

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

示例情况:

一个 SwiftUI 登录视图,我将登录到另一个类并期望返回结果:

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”在一个包中并且“登录助手”在在主应用程序中)和/或这是否会被普遍接受为解决方案。

【问题讨论】:

  • 当然可以使用元组类型;这很常见。关于完成处理程序的东西是没有意义的; Combine 的全部意义在于它取代了完成处理程序的使用:“理顺”异步代码正是它的意义所在。如果您有一个不属于您的完成处理程序类型方法,但您想将它与 Combine 一起使用,那就是 Future。
  • 在您的场景中,观察对象在哪里?是否有理由在视图而不是视图模型中执行此操作?

标签: ios swiftui combine


【解决方案1】:
  1. 是的,这很常见。
  2. 不,使用像这样的完成处理程序会违背 Combine 的内置完成处理程序。而不是使用直通,您应该有一个函数,该函数接受用户名和密码并生成发布者,订阅该发布者将为您提供完成/输出处理。这样的函数通常存在于ObservableObject 中,您将其作为@EnvironmentObject 注入到视图层次结构中。

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

【讨论】:

  • 环境对象与通过视图init简单地注入类相比如何?是否有理由将其作为可观察对象?感谢您的帮助!
  • EnvironmentObject 是您想要在应用程序的多个位置需要登录信息时使用的对象(几乎所有应用程序最终都有此要求)。
  • EnvironmentObject 允许您实例化给定类型的单个对象,并且它在注入它的视图下方的所有视图中保持活动状态(因此大多数用例涉及在根视图上注入)。如果您有一个仅在单个视图中需要的视图模型,而不是注入它,最好使用的内置方法是 StateObject,它将实例化一次并在视图刷新时保持活动状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多