如何在 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: &amp;)。使用.assign(to:)时也不需要.store(in: &amp;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 的已发布属性?

如何在一个视图中发出多个 Fe​​tch 请求(SwiftUI)

如何在 SwiftUI 中使用多个 Picker 更改 UIPickerView 宽度?

SwiftUI:如何将 NSManagedObjectContext 传递到多个视图模型中

如何在 SwiftUI 中一个接一个地显示多个警报对话框?

如何告诉 SwiftUI 视图绑定到多个嵌套的 ObservableObject