RxSwift - 操作符二

2022-07-06  本文已影响0人  aven_kang

from

将其他类型或者数据结构转换为 Observable


from

当你在使用 Observable 时,如果能够直接将其他类型转换 为 Observable ,这将是非常省事的。from 操作符就提供了 这种功能。

用例

将一个数组转换为 Observable :

let numbers = Observable.from([0,1,2,3])
        
        numbers.subscribe { index in
            print(index)
        }.disposed(by: bag)
// 等价于下面的代码
        let numbers1 = Observable<Int>.create { obser in
            obser.onNext(0)
            obser.onNext(1)
            obser.onNext(2)
            obser.onNext(3)
            return Disposables.create()
        }
        
        numbers1.subscribe { index in
            print(index)
        }.disposed(by: bag)

groupBy

将源 Observable 分解为多个子 Observable ,并且每个子Observable 将源 Observable 中“相似”的元素发送出来


groupBy

groupBy 操作符将源 Observable 分解为多个子Observable ,然后将这些子 Observable 发送出来。
它会将元素通过某个键进行分组,然后将分组后的元素序列 以 Observable 的形态发送出来。

用例

let numbers = Observable
            .from([0,1,2,3])
            .groupBy { element in
                element / 2 == 0 ? 1 : 0
            }
        
        numbers.subscribe { event in
            switch event {
            case .next(let group):
                group.asObservable().subscribe { event in
                    print("groupkey: \(group.key)  \(event)")
                }.disposed(by: self.bag)
            default:
                print("")
            }
        }.disposed(by: bag)

输出结果

groupkey: true  next(0)
groupkey: true  next(1)
groupkey: false  next(2)
groupkey: false  next(3)
groupkey: false  completed
groupkey: true  completed

从输出结果可以看出来,经过.groupBy 操作的Observable,在订阅的时候,经过筛选的observable其实是藏在.next事件里面的group里,通过group.key取出来

ignoreElements

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

ignoreElements
ignoreElements操作符将阻止Observable发出next事件,但是允许他发出 error 或 completed 事件。 如果你并不关心 Observable 的任何元素,你只想知道Observable 在什么时候终止,那就可以使用ignoreElements操作符。

用例

        let numbers = Observable.from([1,2,3,4,5])
            .ignoreElements()

        numbers.subscribe { event in
            
            switch event {
            case .next(let number):
                print(number)
            case .error(let error):
                print("error")
            case .completed:
                print("comleted")
            default:
                print("")
            }
        }.disposed(by: bag)

加了.ignoreElements之后,将不再打印.next发出的事件,如果没有错误事件,那么就只会发出completed事件,如果注释了.ignoreElements,将是正常的打印.next发出的事件

interval

创建一个 Observable 每隔一段时间,发出一个索引数


interval

interval 操作符将创建一个 Observable ,它每隔一段设定的 时间,发出一个索引数的元素。它将发出无数个元素。

 let subject = PublishSubject<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
        subject.subscribe { index in
            print(index)
        }.disposed(by: bag)
/// 这两种写法都是可以的
        let timer = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
        timer.subscribe { index in
            print(index)
        }.disposed(by: bag)
上一篇 下一篇

猜你喜欢

热点阅读