重置密码呼叫发生了2次,如何删除该区块中的订阅。
let digits = [firstDigit, secondDigit, thirdDigit, fourthDigit, fifthDigit, sixthDigit]
let digitsValid = digits.map { $0?.textField.rx.text.orEmpty.map({ $0.count == 1 }).share(replay: 1) }
let allDigitsFilled = Observable.combineLatest(digitsValid.map{ $0 ?? BehaviorRelay(value: false).asObservable()}).share(replay: 1)
allDigitsFilled.subscribe (onNext: { [weak self] (boolArray) in
guard let self = self else { return }
let isFilled = boolArray.allSatisfy({ $0 })
if isFilled {
self.viewModel.resetPassword()
}
}).disposed(by: disposeBag)
答案 0 :(得分:0)
每当任何文本字段更改其内容时,就会调用onNext块。您的首要目标应该是做到这一点,以便仅在您要重置密码时才调用该块。
因此,首先,您想将.allSatisfy
放在Observable.filter调用中,以便仅当所有六个文本字段都恰好包含1个字符时才调用onNext块。完成此操作后,您只需使用.take(1)
,它将在发出下一个值后完成订阅。
类似的事情应该可以做到,而且看起来还挺干净:
let digits = [firstDigit, secondDigit, thirdDigit, fourthDigit, fifthDigit, sixthDigit]
let texts = digits.compactMap { $0?.textField.rx.text.orEmpty }
Observable.combineLatest(texts)
.filter { $0.allSatisfy { $0.count == 1 } }
.map { _ in }
.take(1)
.subscribe(onNext: { [viewModel] in
viewModel?.resetPassword()
})
.disposed(by: disposeBag)