rxswift 学习心得

Observable 序列 异步地产生 可携带数据 Event(next,error,completed)
创建
1.just() 传入一个默认值来初始化: Observable.just(5)
2.of() 接受可变数量的参数(必需要是同类型的) Observable.of(“A”, “B”, “C”)
3.from() 一个数组参数 Observable.from([“A”, “B”, “C”])
4.empty() 一个空内容的序列
5.create() 接受一个 block 形式的参数
6.interval() 隔一段设定的时间,会发出一个索引数的元素
7.timer() 经过设定的一段时间,产生唯一的一个元素

Observer 监听事件,然后对这个事件做出响应
(AnyObserver,Binder 区别 1.不会处理错误事件. 2.确保绑定都是在给定 Scheduler 上执行(默认 MainScheduler))
1.在 subscribe,bind方法中创建
2.实例化创建

自动扩展(利用binder)
1.UI 类进行扩展
extension UILabel {
public var fontSize: Binder {
return Binder(self) { label, fontSize in
label.font = UIFont.systemFont(ofSize: fontSize)
}
}
}
observable.map { CGFloat($0) }.bind(to: label.fontSize).disposed(by: disposeBag)

2.Reactive 类进行扩展
extension Reactive where Base: UILabel {
public var fontSize: Binder {
return Binder(self.base) { label, fontSize in
label.font = UIFont.systemFont(ofSize: fontSize)
}
}
}
observable.map { CGFloat($0) }.bind(to: label.rx.fontSize).disposed(by: disposeBag)

Subjects (既是订阅者,也是 Observable)
区别只是在于:当一个新的订阅者刚订阅它的时候,能不能收到 Subject 以前发出过的旧 Event,如果能的话又能收到多少个

PublishSubject 不需要初始值就能创建,不能收到旧 Event

BehaviorSubject 需要默认初始值 能缓存一个旧 Event

ReplaySubject 需要默认初始值,需要设置一个 bufferSize 设置缓存几个event

BehaviorRelay (Variable)其实就是对 BehaviorSubject 的封装有一个 value 属性 会把事件最新的保存value 属性里,它会在销毁时自动发送 .complete的 event

变换操作符(buffer,map,flatMap,concatMap,scan)
buffer:达到某个数量,或者经过了特定的时间,它就会将这个元素集合发送出来,第一个参数是缓冲时间,第二个参数是缓冲个数,第三个参数是线程

序列套序列的情况
flatMap 避免了map出现“升维”的情况
flatMapLatest flatMapLatest只会接收最新的value 事件
concatMap 当前一个 Observable 元素发送完毕后,后一个Observable 才可以开始发出元素。或者说等待前一个 Observable 产生完成事件后,才对后一个 Observable 进行订阅。

scan 就是先给一个初始化的数,然后不断的拿前一个结果和最新的值进行处理操作

groupBy 正常序列事件正常进行,主要是完成时间

过滤操作符 (filter、take、skip)

take :该方法实现仅发送 Observable 序列中的前 n 个事件,在满足数量之后会自动 .completed

takeLast:仅发送 Observable序列中的后 n 个事件

skip:跳过源 Observable 序列发出的前 n 个事件

distinctUntilChanged 操作符用于过滤掉连续重复的事件,注意是连续重复

single 限制只发送一次事件,如存在有多个事件或者没有事件都会发出一个 error 事件

elementAt 只处理在指定位置的事件

ignoreElements 忽略掉所有的元素,只发出 error或completed 事件。

条件和布尔操作符(takeUntil,skipUntil,takeWhile,skipWhile,amb)

takeUntil,skipUntil(两信号)

takeUntil 除了订阅源 Observable 外,通过 takeUntil 方法我们还可以监视另外一个 Observable, 即 notifier,如果 notifier 发出值或 complete 通知,那么源 Observable 便自动完成,停止发送事件。

skipUntil 与takeUntil 相反的是。源 Observable 序列事件默认会一直跳过,直到 notifier 发出值或 complete 通知

takeWhile 法依次判断 Observable 序列的每一个值是否满足给定的条件。 当第一个不满足条件的值出现时,它便自动完成。

skipWhile 一旦遇到不满足条件的事件,之后就不会再跳过了。

注意接收的元素是序列
amb 当传入多个 Observables 到 amb 操作符时,它将取第一个发出元素或产生事件的 Observable,然后只发出它的元素。并忽略掉其他的 Observables

结合操作(merge,zip,combineLatest)

merge 可以将多个(两个或两个以上的)Observable 序列合并成一个 Observable序列 及合并订阅者

zip 与merge不一样的时候它会等到每个 Observable 事件一一对应地凑齐之后再合并。

combineLatest zip 不同的是,每当任意一个 Observable 有新的事件发出时,它会将每个 Observable 序列的最新的一个事件元素进行合并。

withLatestFrom 将两个 Observable 序列合并为一个。每当 self 队列发射一个元素时,便从第二个序列中取出最新的一个值。

switchLatest 可以对事件流进行转换。
比如本来监听的 subject1,我可以通过更改 variable 里面的 value 更换事件源。变成监听 subject2

算数、以及聚合操作

toArray 一个序列转成一个数组,并作为一个单一的事件发送,然后结束

reduce 给定的初始值,与序列里的每个值进行累计运算。得到一个最终结果,并将其作为单个值发送出去。
Observable.of(1, 2, 3, 4, 5)
.reduce(0, accumulator: +)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag

只有当前面一个 Observable 序列发出了 completed 事件,才会开始发送下一个 Observable 序列事件

连接操作 (同一序列,不同订阅者,作用是 两个订阅者接收到的序列值是同步的

publish 将一个正常的序列转换成一个可连接的序列 不会立刻发送事件,只有在调用 connect 之后才会开始

replay replay 与 publish 不同在于:新的订阅者还能接收到订阅之前的事件消息(数量由设置的 bufferSize 决定)

multicast 方法还可以传入一个 Subject,每当序列发送事件时都会触发这个 Subject 的发送

refCount 将可被连接的 Observable 转换为普通 Observable

share(relay:) 使观察者共享源 Observable,并且缓存最新的 n 个元素,将这些元素直接发送给新的观察者。

其他一些实用的操作符

delay 将 Observable 的所有元素都先拖延一段设定好的时间,然后才将它们发送出来

delaySubscription 设定的时间后,才对 Observable 进行订阅操作

timeout 设置一个超时时间。如果源 Observable 在规定时间内没有发任何出元素,就产生一个超时的 error 事件

materialize 可以将序列产生的事件,转换成元素。

dematerialize 作用和 materialize 正好相反,它可以将 materialize 转换后的元素还原

特征序列

Driver asDriver(onErrorJustReturn: []) 相当于以下代码: 序列不会产生错误事件并且一定在主线程监听 安全的绑定 UI元素
.observeOn(MainScheduler.instance) // 主线程监听
.catchErrorJustReturn(onErrorJustReturn) // 无法产生错误
.share(replay: 1, scope: .whileConnected)// 共享状态变化

ControlProperty ,ControlEvent 是专门用来描述 UI 控件属性,拥有该类型的属性都是被观察者(Observable)

Single 是 Observable 的另外一个版本。但它不像 Observable 可以发出多个元素,它要么只能发出一个元素,要么产生一个 error 事件
发出一个元素,或一个 error 事件,不会共享状态变化
asSingle() 将普通序列转成single序列

Completable 用于那些只关心任务是否完成,而不需要在意任务返回值的情况

Maybe 它要么只能发出一个元素,要么产生一个 completed 事件,要么产生一个 error 事件。适合那种可能需要发出一个元素,又可能不需要发出的情况
asMaybe()

Rx 中的 Observables 是一个拉驱动的事件序列
推驱动:在创建的时候,序列中的值不会被立即赋值,之后才会被赋值。(网络请求)
拉驱动:在创建信号的时候,序列中的值就会被确定下来,我们可以从流中一个一个的拿到值

每次订阅这个信号, observable 都会执行 create 这个闭包,每一次调用subscribe(…) ,也就是订阅某个信号,都会给这次订阅创建新的信号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值