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 有啥区别