30天学RxSwift-ObserverType,AnyObse
在RxSwift中有一个ObserverType协议。实现ObserverType协议的是观察者对象,用于观察Observable发出的信号。对于观察到的信号有个处理方法func on(event: Event)。
可以直接用来使用的实现ObserverType的对象就是AnyObserver。订阅Observable的方式就是subscribe。
在RxCocoa中可以看到UILabel的rx_text属性就是AnyObserver<String>类型的。回看上一节提到的问题,当点击按扭时让UILabel显示字符串。上一节说到可以在subscribeNext中赋值,但是这个显然不够Rx。这里给出更加优雅的方式。
button.rx_tap
.map { _ in "Test" }
.bindTo(label.rx_text)
这里的map是将button点击的信号内容从Void转换成"Text",然后直接将值绑定在label上。这里的bindTo和subscribe实现的是等价的,但依RxCocoa中所说的,bindTo的内在实现更好,并且bindTo这个名称也很直观,所以当引入了RxCocoa这个framework后一般我都是用bindTo来实现UI的订阅。
这样或许还看不出来优雅在哪里,那再举一个栗子。
本节还有个概念没讲到,那就是ControlProperty,ControlProperty是一个实现ControlPropertyType的对象ControlPropertyType是继承ObservableType, ObserverType协议的协议。因此我们可以将ControlProperty的变量当作Observable来使用。
textField.rx_text
.bindTo(label.rx_text)
这里将textField的值与label绑定在一起了,这样当textField的输入改变时,label就会实时响应。再也不需要设置delegate实现delegate方法了,感觉世界一下子美好了。