在 Combine 中合并两个 AnyPublisher
Combine two AnyPublisher in Combine
我有两个用户名测试,我想要两个,这样我就可以有不同的消息来确定用户名的长度,一个测试用户名的有效性。
到目前为止还不错,但我想将它们结合起来以确保我可以启用我的注册 UIButton
@Published var username: String = ""
var validLengthUsername: AnyPublisher<Bool, Never> {
return $username.debounce(for: 0.2, scheduler: RunLoop.main)
.removeDuplicates()
.map{[=10=].count > 6 ? true : false}
.eraseToAnyPublisher()
}
var formattedUserName: AnyPublisher<Bool, Never> {
return $username
.removeDuplicates()
.map{[=10=].isValidEmail() ? true : false}
.eraseToAnyPublisher()
}
我正在尝试映射它们 - 但是这给了我一个 AnyPublisher 数组。这不是我想要的 - 我想结合 validLengthUsername && formattedUserName - 我试过了但我不能简单地将两个 AnyPublisher
.
您可以使用 zip
创建一个 Publisher
,一旦两个发布者都发出一个新值,它就会发出一个值,并对压缩发布者的元素使用 AND 运算符。
var fullValidation: AnyPublisher<Bool, Never> {
validLengthUsername
.zip(formattedUserName)
.map { [=10=] && }
.eraseToAnyPublisher()
}
我有两个用户名测试,我想要两个,这样我就可以有不同的消息来确定用户名的长度,一个测试用户名的有效性。
到目前为止还不错,但我想将它们结合起来以确保我可以启用我的注册 UIButton
@Published var username: String = ""
var validLengthUsername: AnyPublisher<Bool, Never> {
return $username.debounce(for: 0.2, scheduler: RunLoop.main)
.removeDuplicates()
.map{[=10=].count > 6 ? true : false}
.eraseToAnyPublisher()
}
var formattedUserName: AnyPublisher<Bool, Never> {
return $username
.removeDuplicates()
.map{[=10=].isValidEmail() ? true : false}
.eraseToAnyPublisher()
}
我正在尝试映射它们 - 但是这给了我一个 AnyPublisher 数组。这不是我想要的 - 我想结合 validLengthUsername && formattedUserName - 我试过了但我不能简单地将两个 AnyPublisher
.
您可以使用 zip
创建一个 Publisher
,一旦两个发布者都发出一个新值,它就会发出一个值,并对压缩发布者的元素使用 AND 运算符。
var fullValidation: AnyPublisher<Bool, Never> {
validLengthUsername
.zip(formattedUserName)
.map { [=10=] && }
.eraseToAnyPublisher()
}