【发布时间】:2021-09-13 23:27:14
【问题描述】:
我刚刚开始使用 Combine。对于这种情况,我有以下问题:
- 是否接受将元组作为 PassthroughSubject 输出?
- 是否接受将完成处理程序作为 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。
-
在您的场景中,观察对象在哪里?是否有理由在视图而不是视图模型中执行此操作?