订阅呼叫2次,如何在RxSwift中取消订阅



重置密码调用发生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)

每当任何文本字段更改其内容时,都会调用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)

最新更新