You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
txtSend.rx.text.changed.flatMapLatest{
new inSingle<Int>.timer(RxTimeInterval.seconds(2), scheduler:MainScheduler.instance).map{
_ in new
}.debug()}.subscribe{
txt inprint(txt)}.disposed(by: disposeBag)
txtSend.rx.text.orEmpty
.throttle(.milliseconds(1000), scheduler:MainScheduler.instance).distinctUntilChanged().flatMapLatest{
t inSingle<Int>.timer(.seconds(2), scheduler:MainScheduler.instance).map{
_ in t
}.debug()}.subscribe{
txt inprint(txt)}.disposed(by: disposeBag)
pickerConfig.rx.modelSelected(String.self).subscribe(onNext:{[weak msgLabel] t in
if let item = t.first {
msgLabel?.text = item
}}).disposed(by: disposeBag)
/**
Subscribes to observable sequence using custom binder function and final parameter passed to binder function
after `self` is passed.
public func bind<R1, R2>(to binder: Self -> R1 -> R2, curriedArgument: R1) -> R2 {
return binder(self)(curriedArgument)
}
- parameter binder: Function used to bind elements from `self`.
- parameter curriedArgument: Final argument passed to `binder` to finish binding process.
- returns: Object representing subscription.
*/
publicfunc bind<R1, R2>(to binder:(Self)->(R1)->R2, curriedArgument:R1)->R2{binder(self)(curriedArgument)}
好了废话不多,直接接上篇
热身一下
先拿UITextField做一下RX结合操作
RxCocoa为相关的UI控件做了包装处理
这样就订阅了整个text控件的输入框变化
👌,但是我并不想这么敏锐,我只是要捕获相对静态一点的稳定的值,比如停止输入后2秒输入不再变化以后再输出要怎么处理那?
思路还是利用正投影,每次输入还处于不稳定态的化,就会被过滤掉。加debug可以看得更清楚一些
基本达成目的,能输出相对稳定的字符了。但是timer被反复创建清理太多次了,性能上还有质疑
再加一层滤网节气阀 throttle
日志打印
有改善,可以滤掉一部分emit,不过必要的周期还是需要的,毕竟不能保证每一次的输入是最后一次
这部分只是热身练习下
UIPickerView的RxSwift改造
在以前的版本里面,我必须在UIViewController里实现UIPickerViewDataSource,UIPickerViewDelegate两个协议接口
实现4个方法
而且必须设置好dataSource和delegate
整体代码体检感不够好,有种松散的感觉
经过RxCocoa的整合一切将变得不同
bind魔法直接让绑定UIPickerView一步到位
对于选中项的处理,原来需要实现didSelectRow,现在改成了这样
直接可以转换成了RX对象来subscribe,一下简洁多了
其实我并不需要在切换config做处理,我只需要拿到当前配置值就行了
需要稍微迂回下,先获取row的index
这里RxSwift也很贴心的给了扩展函数,提供可以获得绑定值。只是返回类型必须指定,否则会推断为Anytype,swift的泛型调用部门是不能声明<>这种类型的,反正是swift定的规矩,只能遵守。
代码实现仓库
Quiet4Swift
一点点深入
RxSwift让我们把控件与代码的联系更加易读和紧密,那么它是怎么做到的那?
比较绕,实际使用是,binder作为入参,传入,我们这次例子里面用的是pickerConfig.rx.itemTitles
curriedArgument是1用尾随闭包的方式作为入参传入,例子里是
binder(self)其实就是先执行一次解包操作,返回(R1) -> R2闭包再把curriedArgument传入再次执行闭包后返回R2
itemTitles的返回是一个闭包,titleForRow参数也是一个闭包,主要功能是提供picker的显示
里面嵌入了一个RxAttributedStringPickerViewAdapter
可以看到RxAttributedStringPickerViewAdapter实现了UIPickerViewDelegate,承担了提供Title的数据的任务
正好实现了UIPickerViewDataSource协议,提供了数据源的标准接口方法
所以说RxSwift其实帮助我们包装了UIPickerViewDataSource和UIPickerViewDelegate,省去了很多底层操作细节。可以让我们的代码更贴近一点业务逻辑代码。基础还是很重要,一步一步来不能随便“跳级”。另外RxSwift的源码真的好难啃,特别是嵌套闭包部分有“盗梦空间”的感觉
比如下面这段
嵌套闭包读起来很烧脑
The text was updated successfully, but these errors were encountered: