带有完成处理程序输出的 PassthroughSubject?
PassthroughSubject with completion handler output?
我刚刚开始使用 Combine。对于这种情况,我有以下问题:
- 是否接受将元组作为 PassthroughSubject 输出?
- 是否接受将完成处理程序作为 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 如果这将被普遍接受为解决方案。
- 是的,很常见。
- 不,使用这样的完成处理程序不利于 Combine 的内置完成处理。与其使用 passthrough,不如使用一个函数来获取用户名和密码并生成发布者,订阅该发布者将为您提供 completion/output 处理。这样的函数通常存在于
ObservableObject
中,您将其作为 @EnvironmentObject
. 注入到视图层次结构中
我刚刚开始使用 Combine。对于这种情况,我有以下问题:
- 是否接受将元组作为 PassthroughSubject 输出?
- 是否接受将完成处理程序作为 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 如果这将被普遍接受为解决方案。
- 是的,很常见。
- 不,使用这样的完成处理程序不利于 Combine 的内置完成处理。与其使用 passthrough,不如使用一个函数来获取用户名和密码并生成发布者,订阅该发布者将为您提供 completion/output 处理。这样的函数通常存在于
ObservableObject
中,您将其作为@EnvironmentObject
. 注入到视图层次结构中