【问题标题】:How to subscribe to multiple publishers in SwiftUI如何在 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)

}

【问题讨论】:

标签: swiftui combine


【解决方案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)
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多