如何在 SwiftUI 中订阅多个发布者

时间:2021-05-15 21:27:09

标签: swiftui combine

我想监听 $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)

}

1 个答案:

答案 0 :(得分:1)

我假设您使用 iOS14 作为最低目标。使用 .assign(to:on:) 并为其添加 self 时,会造成内存泄漏。 iOS 14 有一个更新,您可以改用 .assign(to: &)。使用 .store(in: &cancellables) 时也不需要 .assign(to:)

要获得您正在寻找的行为,我建议您使用 .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)
}