RxSwift篇章
1.ControlEvent
ControlEvent: 专门用于描述 UI 控件所产生的事件,它具有以下特征
-
不会产生 error 事件
-
一定在 MainScheduler 订阅(主线程订阅)
-
一定在 MainScheduler 监听(主线程监听)
-
会共享附加作用
let controlEventOb = self.button.rx.controlEvent(.touchUpInside)
controlEventOb.subscribe { (result) in
print(result)
print(Thread.current)
}
.disposed(by: disposeBag)
- controlEvent(.touchUpInside)内部: events.subscribeOn(ConcurrentMainScheduler.instance),保证主队列调度
- UI响应事件,不会存在失败响应
2.binder
-
不会处理错误事件
-
确保绑定都是在给定 Scheduler 上执行(默认 MainScheduler)
-
一旦产生错误事件,在调试环境下将执行 fatalError,在发布环境下将打印错误信息。
let binder = Binder<Bool>(self.label) { (lab, isHidden) in
print("binder")
print("Binder当前线程:\(Thread.current)")
lab.isHidden = isHidden
}
//
let observable1 = Observable<Bool>.create { (ob) -> Disposable in
ob.onNext(true)
// ob.onError(NSError.init(domain: "com.err.cn", code: 10086, userInfo: nil))
// ob.onCompleted()
return Disposables.create()
}
.observeOn(ConcurrentDispatchQueueScheduler(queue: DispatchQueue.global()))
//
observable1.bind(to: binder).disposed(by: self.disposeBag)
3.driver
Driver 是一个精心准备的特征序列。它主要是为了简化 UI 层的代码。不过如果你遇到的序列具有以下特征,你也可以使用它:
-
不会产生 error 事件
-
一定在 MainScheduler 监听(主线程监听)
-
会共享附加作用
let result = self.textFiled.rx.text.orEmpty
.asDriver() // 普通序列转化
// 绑定到label上面
result.map { "长度:\(($0 ).count)" }
.drive(self.label.rx.text)
.disposed(by: disposeBag)
// 绑定到button上面
result.map { ($0 ) }
.drive(self.button.rx.title())
.disposed(by: disposeBag)
asDriver()内部封装:
-
observeOn(DriverSharingStrategy.scheduler),保证了调度环境在主线程
-
source.share(replay: 1, scope: .whileConnected), 保证序列状态共享
4.signal
Signal 和 Driver 相似,唯一的区别是,Driver 会对新观察者回放(重新发送)上一个元素,而 Signal 不会对新观察者回放上一个元素。
-
这个demo初始运行时 label响应,但是对于我们的新的观察者button不响应.后续输入框事件都响应.
-
不会产生 error 事件
-
一定在 MainScheduler 监听(主线程监听)
-
会共享附加作用
let result = self.textFiled.rx.text.orEmpty
.asSignal(onErrorJustReturn: "没有值") // 普通序列转化为
// 绑定到label上面
result.map { "长度:\(($0 ).count)" }
.emit(to: self.label.rx.text)
.disposed(by: disposeBag)
// 绑定到button上面
result.map { ($0 ) }
.emit(to: self.button.rx.title())
.disposed(by: disposeBag)
asSignal()内部封装:
-
observeOn(DriverSharingStrategy.scheduler)保证了调度环境在主线程
-
catchErrorJustReturn(onErrorJustReturn) 保证了无错误信号
-
source.share(scope: .whileConnected) 序列状态共享
5. single
它要么只能发出一个元素,要么产生一个 error 事件。
-
发出一个元素,或一个 error 事件
-
不会共享附加作用
let singleOB = Single<Any>.create { (single) -> Disposable in
print("singleOB 是否共享")
single(.success("OK"))
single(.error(NSError.init(domain: "com.lgcoooci.cn",
code: 10086, userInfo: nil)))
return Disposables.create()
}
singleOB.subscribe { (reslut) in
print("订阅:\(reslut)")
}.disposed(by: disposeBag)
singleOB.subscribe { (reslut) in
print("订阅:\(reslut)")
}.disposed(by: disposeBag)
6.completable
它要么只能产生一个 completed 事件,要么产生一个 error 事件
-
发出零个元素
-
发出一个 completed 元素,或一个 error 事件
-
不会共享附加作用
-
Completable 适用于那种你只关心任务是否完成,而不需要在意任务返回值的情况。它和 Observable 有点相似。
let completableOB = Completable.create { (completable) -> Disposable in
completable(.completed)
completable(.error(NSError.init(domain: "error....",
code: 10086, userInfo: nil)))
return Disposables.create()
}
completableOB.subscribe { (reslut) in
print("订阅:\(reslut)")
}.disposed(by: disposeBag)
completableOB.subscribe { (reslut) in
print("订阅:\(reslut)")
}.disposed(by: disposeBag)
7.maybe
它介于 Single 和 Completable 之间,它要么只能发出一个元素,要么产生一个completed 事件,要么产生一个 error 事件。
-
发出一个元素或者一个 completed 事件或者一个 error 事件
-
不会共享附加作用
-
如果你遇到那种可能需要发出一个元素,又可能不需要发出时,就可以使用 Maybe。
let maybeOB = Maybe<Any>.create { (maybe) -> Disposable in
//maybe(.success("OK"))
//maybe(.completed)
maybe(.error(NSError.init(domain: "error...",
code: 10086, userInfo: nil)))
return Disposables.create()
}
maybeOB.subscribe { (reslut) in
print("订阅:\(reslut)")
}.disposed(by: disposeBag)
maybeOB.subscribe { (reslut) in
print("订阅:\(reslut)")
}.disposed(by: disposeBag)