【问题标题】:RxSwift Build an Observable based on a VariableRxSwift 基于变量构建 Observable
【发布时间】: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 从未被调用!

这背后的原因是:

  1. fullName 变量通过双向运算符 绑定到 UITextField,如 RxSwift 示例中所定义。
  2. 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) 调用。删除它解决了一切。但我不知道为什么。 :-(

标签: ios swift observable rx-swift rx-cocoa


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多