前言
其实,这一篇的题目,我觉得应该是RxSwift对代理的封装,最后还是沿用官方Example的命名吧。
效果说明
图一
图二
图一是当App可以使用定位信息时,显示当前的经纬度。
图二是当App被禁止使用定位信息时,显示的提示信息
代码解释
比起上两个Example,这个Example复杂的多了。主要复杂在对Delegate的封装。
如何使用RxSwift对Delegate的封装稍后再说,先看看封装后的使用。
let service = GeolocationService.instance
// 将是否允许使用定位的“Bool”绑定noGeolocationView.rx.isHidden
service.authorized
.drive(noGeolocationView.rx.isHidden)
.addDisposableTo(disposeBag)
// 将定位信息绑定在showLocationLabel.rx.coordinates
service.location
.drive(showLocationLabel.rx.coordinates)
.addDisposableTo(disposeBag)
1、对UILabel的扩展
可以看到上面的例子,将CLLocationCoordinate2D的经纬度信息绑定在label上了。当想绑定的在视图信息越多,我们就需要对UILabel进行扩展。
扩展方法如下:
/*
意思就是当Reactive的Base对象是UILabel时,增加一个类型为UIBindingObserver<Base, CLLocationCoordinate2D>的coordinates属性。
*/
private extension Reactive where Base: UILabel {
var coordinates: UIBindingObserver<Base, CLLocationCoordinate2D> {
return UIBindingObserver(UIElement: base, binding: { (label, location) in
label.text = "Lat: \(location.latitude)\nLon: \(location.longitude)"
})
}
}
在后面的block参数列表中