RxSwift 基于变量构建 Observable

Posted

技术标签:

【中文标题】RxSwift 基于变量构建 Observable【英文标题】:RxSwift Build an Observable based on a Variable 【发布时间】:2017-03-07 19:42:20 【问题描述】:

我正在尝试构建一个 Observable,它会根据变量的值输出一个值。

类似的东西:

let fullName = Variable<String>("")
let isFullNameOKObs: Observable<Bool>

isFullNameOKObs = fullName
            .asObservable()
            .map  (val) -> Bool in
                // here business code to determine if the fullName is 'OK'
                let ok = val.characters.count >= 3
                return ok
            

不幸的是 map func 中的 bloc 从未被调用!

这背后的原因是:

    fullName 变量通过双向运算符 绑定到 UITextField,如 RxSwift 示例中所定义。 isFullNameOKObs Observable 将被观察到隐藏或显示我的 ViewController 的提交按钮。

任何帮助将不胜感激。

谢谢

型号

class Model 

    let fullName = Variable<String>("")
    let isFullNameOKObs: Observable<Bool>

    let disposeBag = DisposeBag()

    init()

        isFullNameOKObs = fullName
            .asObservable()
            .debug("isFullNameOKObs")
            .map  (val) -> Bool in
                let ok = val.characters.count >= 3
                return ok
            
            .debug("isFullNameOKObs")


        isRegFormOKObs = Observable.combineLatest(
            isFullNameOKObs,
            is...OK,
            ... )  $0 && $1 && ... 


        isRegFormOKObs
            .debug("isRegFormOKObs")
            .asObservable()
            .subscribe  (event) in
                // update the OK button
            
            // removing this disposedBy resolved the problem
            //.disposed(by: DisposeBag())

    

视图控制器:

func bindModel() -> Void 

    _ = txFullName.rx.textInput <-> model!.fullName
    ......


【问题讨论】:

已解决,但我不明白如何。我对表单的每个 TextField 使用相同的模式:一个名为 isMyTextFieldOK 的 Observable,它计算一些业务规则。一个最终的 observable,它是所有 isMyTextFieldOK observable 中的 combineLatest。我确实在最后一个 observable 上附加了一个 dispose(by: disposeBag) 调用。删除它解决了一切。但我不知道为什么。 :-( 【参考方案1】:

您需要UITextField 和您的Variable 之间的双向绑定吗?

如果没有,我建议您尝试只使用bindTo(),而不是像这样: myTextField.rx.text.orEmpty.bindTo(fullName).disposed(by: disposeBag)

【讨论】:

不变。变量由 UITextField 正确更新。但是 Observable 的值仍然不能反映正确的情况。 如何将isFullNameOKObs 绑定到您的按钮?请分享您正在使用的代码 还没确定怎么做。 据我所知,正确的方法是:isFullNameOKObs.bindTo(myButton.rx.isEnabled).disposed(by: disposeBag)。关于您对删除disposed(by: disposeBag) 的评论:这可能是因为您过早地处理了您的订阅,即。通过在代码中设置disposeBag = nil

以上是关于RxSwift 基于变量构建 Observable的主要内容,如果未能解决你的问题,请参考以下文章

如何测试 RxSwift 变量和 RxCocoa Observable 之间的 UI 绑定?

IOS RxSwift 从 Observable 数组创建 Observable 数组

rxSwift 中的 observable 和 subject 有啥区别

RxSwift 对一个 observable 的多个订阅

iOS RxSwift - 如何“断开”一个 observable?

RxSwift:延迟 observable 直到另一个 observable 完成?