RXswift 创建观察者的几种方式:
所谓观察者,就是对事件的处理者。有以下几种方式
- 在 subscribe 方法中创建
- 在 bind 方法中创建
- 使用 AnyObserver 创建任意类型的观察者
- 使用 Binder 创建特定场景的观察者
在 subscribe 方法中创建
let observable = Observable.of("A", "B", "C")
observable.subscribe(onNext: { element in
print(element)
}, onError: { error in
print(error)
}, onCompleted: {
print("completed")
})
在 bind 方法中创建
//Observable序列(每隔1秒钟发出一个索引数)
let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
observable
.map { "当前索引数:\($0 )"}
.bind { [weak self](text) in
//收到发出的索引数后显示到label上
self?.label.text = text
}
.disposed(by: disposeBag)
使用 AnyObserver 创建任意类型的观察者
// 指定观察者使用的数据类型,并对发生的事件进行处理
let observer: AnyObserver<String> = AnyObserver { (event) in
switch event {
case .next(let data):
print(data)
case .error(let error):
print(error)
case .completed:
print("completed")
}
}
let observable = Observable.of("A", "B", "C")
// 可观察者订阅到观察者
observable.subscribe(observer)
也可以使用 bindTo 绑定到观察者
//观察者
let observer: AnyObserver<String> = AnyObserver { [weak self] (event) in
switch event {
case .next(let text):
//收到发出的索引数后显示到label上
self?.label.text = text
default:
break
}
}
//Observable序列(每隔1秒钟发出一个索引数)
let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
observable
.map { "当前索引数:\($0 )"}
.bind(to: observer)
.disposed(by: disposeBag)
}
使用 Binder 创建特定场景的观察者
相较于AnyObserver
的大而全,Binder
更专注于特定的场景。Binder
主要有以下特征:
- 不会处理错误事件,一旦产生错误,在 debug 模式下,执行 fatelError,在发布环境打印错误信息
- 确保绑定都是在给定线程上执行,默认是主线程
//观察者
let observer: Binder<String> = Binder(label) { (view, text) in
//收到发出的索引数后显示到label上
view.text = text
}
//Observable序列(每隔1秒钟发出一个索引数)
let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
observable
.map { "当前索引数:\($0 )"}
.bind(to: observer)
.disposed(by: disposeBag)
}
创建自定义可绑定属性
- 通过对 NSView 类进行扩展
- 通过对 Reactive 类进行扩展
比如给 NSTextFiled 增加 fontSize 属性
extension NSTextField {
public var fontSize:Binder<CGFloat>{
return Binder(self, binding: { (label, fontSize) in
label.font = NSFont.systemFont(ofSize: fontSize)
})
}
}
可以这么使用:
//Observable序列(每隔0.5秒钟发出一个索引数)
let observable = Observable<Int>.interval(0.5, scheduler: MainScheduler.instance)
observable
.map { CGFloat($0) }
.bind(to: label.fontSize) //根据索引数不断变放大字体
.disposed(by: disposeBag)
}
通过对Reactive 类进行扩展,这么写更加规范,使用时,需要使用.rx.自定义属性
extension Reactive where Base: NSTextField {
public var fontSize: Binder<CGFloat> {
return Binder(self.base) { label, fontSize in
label.font = NSFont.systemFont(ofSize: fontSize)
}
}
}
可以这么使用
let observable = Observable<Int>.interval(0.5, scheduler: MainScheduler.instance)
observable
.map { CGFloat($0) }
.bind(to: label.rx.fontSize) //根据索引数不断变放大字体
.disposed(by: disposeBag)
}
RxSwift 也有很多自带的可绑定属性,比如对 NSTextFiled 就有 text
网友评论