【发布时间】: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) 调用。删除它解决了一切。但我不知道为什么。 :-(
标签: ios swift observable rx-swift rx-cocoa