ControlEvent
ControlEvent:专门描述UI控件所产生的事件:
- 不会产生error
- 一定在MainScheduler订阅
- 一定在MainScheduler监听
- 会共享附加作用
let controlEventOB = self.btn.rx.controlEvent(.touchUpInside)
controlEventOB.subscribe { (reslut) in
print("订阅:\(reslut) \n \(Thread.current)")
}.disposed(by: disposeBag)
controlEventOB.subscribe { (reslut) in
print("订阅:\(reslut) \n \(Thread.current)")
}.disposed(by: self.disposeBag)
- events.subscribeOn(ConcurrentMainScheduler.instance)保证主队列调度
- UI响应事件,不会存在失败响应
binder
- 不会处理错误事件
- 确保帮顶给定Scheduler上执行(默认MainSchedluer)
- 一旦产生错误事件,在调试环境下将执行fatalError,发布环境下打印错误信息
let observer : AnyObserver<Bool> = AnyObserver { (event) in
print("observer当前线程:\(Thread.current)")
switch event{
case .next(let isHidden) :
print("来了,请看label的状态")
self.label.isHidden = isHidden
case .error(let error) :
print("\(error)")
case .completed :
print("完成了")
}
}
let binder = Binder<Bool>(self.label) { (lab, isHidden) in
print("Binder当前线程:\(Thread.current)")
lab.isHidden = isHidden
}
let observable = Observable<Bool>.create { (ob) -> Disposable in
ob.onNext(true)
ob.onError(NSError.init(domain: "com.lgcoooci.cn", code: 10086, userInfo: nil))
ob.onCompleted()
return Disposables.create()
}.observeOn(ConcurrentDispatchQueueScheduler(queue: DispatchQueue.global()))
// observable.bind(to: observer).disposed(by: self.disposeBag)
observable.bind(to: binder).disposed(by: self.disposeBag)
Driver
主要是为了简化 UI 层的代码。不过如果你遇到的序列具有以下特征:
- 不会产生error事件
- 一定在MainSchedluer监听
- 会共享附加作用
let result = self.textFiled.rx.text.orEmpty
.asDriver() // 普通序列转化为
.throttle(.milliseconds(500))
.flatMap {
self.dealwithData(inputText: $0)
.asDriver(onErrorJustReturn: "检测到了错误")
}
// 绑定到label上面
result.map { "长度:\(($0 as! String).count)" }
.drive(self.label.rx.text)
.disposed(by: disposeBag)
// 绑定到button上面
result.map { ($0 as! String) }
.drive(self.btn.rx.title())
.disposed(by: disposeBag)
- 底层源码封装source.share(replay:1,scope:.whileconnected)序列状态共享
- catchErrorJustReturn(onErrorJustReturn) 保证了无错误信号
- observeOn(DriverSharingStrategy.scheduler)保证了调度环境在主线程
网友评论