订阅呼叫2次,如何在RxSwift中取消可观察的订阅

时间:2020-10-02 21:41:03

标签: swift observable rx-swift subscription

重置密码呼叫发生了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)

1 个答案:

答案 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)