如何在 SwiftUI 中订阅多个发布者
Posted
技术标签:
【中文标题】如何在 SwiftUI 中订阅多个发布者【英文标题】:How to subscribe to multiple publishers in SwiftUI 【发布时间】:2021-05-15 21:27:09 【问题描述】:我想监听 $email 和 $password 的更改,然后将结果存储在 signInDisabled 中,但我不确定如何监听两者的更改。
@Published var email = ""
@Published var password = ""
var signInDisabled = true
var session : SessionListenerProtocol
private var cancellables = Set<AnyCancellable>()
init()
// ???
$email, $password email, password in
email == "" || password == ""
.assign(to: \.signInDisabled, on: self)
.store(in: &cancellables)
【问题讨论】:
取决于你的意思。您可以使用merge、zip 或combineLatest。请参阅我的***.com/a/67099668/341994 进行一些讨论,并在线预订以了解详细信息。 apeth.com/UnderstandingCombine/operators/operatorsJoiners/… @matt 我试过 $email.zip($password) email, password 但是这个功能只在修改邮箱时触发,不是密码。 【参考方案1】:我假设您使用 ios14 作为最低目标。当使用.assign(to:on:)
并添加 self 时,会造成内存泄漏。 iOS 14 有一个更新,您可以改用 .assign(to: &)
。使用.assign(to:)
时也不需要.store(in: &cancellables)
。
要获得您正在寻找的行为,我建议您使用.combineLatest
工具,该工具将读取您的两个值,并且不要忘记将signInDisabled
和@Publisher
作为组合值读取.我还添加了一个.removeDuplicates()
以避免组合管道在不需要时将多次相同的值设置为signInDisabled
。
@Published var email = String()
@Published var password = String()
@Published var signInDisabled = true
init()
$email
.combineLatest($password)
.map $0.0 == String() || $0.1 == String()
.removeDuplicates()
.assign(to: &$signInDisabled)
【讨论】:
以上是关于如何在 SwiftUI 中订阅多个发布者的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 SwiftUI 何时订阅了 ObservableObject 的已发布属性?
如何在一个视图中发出多个 Fetch 请求(SwiftUI)
如何在 SwiftUI 中使用多个 Picker 更改 UIPickerView 宽度?