RxSwift笔记 - Transforming Observables

57 篇文章 1 订阅
23 篇文章 0 订阅

map

该操作符通过传入一个函数闭包把原来的 Observable 序列转变为一个新的 Observable 序列

屏幕快照 2018-05-27 下午3.00.08.png

Observable.of(1, 3, 5, 7, 9)
    .map({ $0 * 10 })
    .subscribe(onNext: { value in
    print(value)
}).disposed(by: disposeBag)

/*
 10
 30
 50
 70
 90
 */

flatMap

将 Observable 的元素转换成其他的 Observable, 然后将这些 Observable 合并

flatMap.c.png

let first = BehaviorSubject(value: "1")
let second = BehaviorSubject(value: "A")
let variable = Variable(first)

variable.asObservable()
    .flatMap({ $0 })
    .subscribe(onNext: {
    print($0)
}).disposed(by: disposeBag)

first.onNext("2")
variable.value = second

second.onNext("B")
first.onNext("3")

/*
 1
 2
 A
 B
 3
 */

flatMapLatest

将 Observable 的元素转换成其他的 Observable,然后取这些 Observables 中最新的一个

一旦转换出一个新的 Observable,就只发出它的元素,旧的 Observables 的元素将被忽略掉

flatMapLatest 与 flatMap 的唯一区别是:flatMapLatest 只会接收最新的 value 事件

flatMapLatest.png


concatMap

它类似于最简单版本的flatMap,但是它按次序连接而不是合并那些生成的Observables,然后产生自己的数据序列

concatMap-1.png


scan

scan 就是先给一个初始化的数,然后不断的拿前一个结果和最新的值进行处理操作。
持续的将 Observable 的每一个元素应用一个函数,然后发出每一次函数返回的结果

屏幕快照 2018-05-27 下午3.04.49.png

Observable<Int>.of(0, 1, 2, 3, 4, 5).scan(0) { (aggregateValue, newValue) in
    aggregateValue + newValue
    }.subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

/*
 0
 1
 3
 6
 10
 15
 */

groupBy

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

groupBy.c.png

// 通过 **值大于10** 添加进行分组
Observable<Int>.of(1, 3, 5, 29, 55, 7, 88, 9).groupBy(keySelector: { (num) -> Bool in
    return num > 10
}).subscribe({ (event) in
    switch event {
    case .next(let group):
        group.asObservable().subscribe({ event in
            print("key: \(group.key)  event: \(event)")
        }).disposed(by: disposeBag)
    default:
        break
    }
}).disposed(by: disposeBag)

// 将奇数偶数分成两组
Observable<Int>.of(0, 1, 2, 3, 4, 5)
    .groupBy(keySelector: { (element) -> String in
        return element % 2 == 0 ? "偶数" : "基数"
    })
    .subscribe { (event) in
        switch event {
        case .next(let group):
            group.asObservable().subscribe({ (event) in
                print("key:\(group.key)    event:\(event)")
            }).disposed(by: disposeBag)
        default:
            print("")
        }
    }.disposed(by: disposeBag)

buffer

缓存元素,然后将缓存的元素集合,周期性的发出来

buffer 方法作用是缓冲组合,第一个参数是缓冲时间,第二个参数是缓冲个数,第三个参数是线程。

该方法简单来说就是缓存 Observable 中发出的新元素,当元素达到某个数量,或者经过了特定的时间,它就会将这个元素集合发送出来。

Buffer.png

let bufferID = Observable<Int>.create { (observer) -> Disposable in
    observer.onNext(1)
    observer.onNext(2)
    observer.onNext(3)
    observer.onNext(4)
    observer.onNext(5)
    observer.onNext(6)
    observer.onNext(7)
    observer.onCompleted()
    return Disposables.create()
}

bufferID.buffer(timeSpan: 0, count: 3, scheduler: MainScheduler.instance)
    .subscribe(onNext: { (nums) in
    print(nums)
}).disposed(by: disposeBag)

/*
 [1, 2, 3]
 [4, 5, 6]
 [7]
 */

window

将 Observable 分解为多个子 Observable,周期性的将子 Observable 发出来

window 操作符和 buffer 十分相似。不过 buffer 是周期性的将缓存的元素集合发送出来,而 window 周期性的将元素集合以 Observable 的形态发送出来。

window.C.png

Observable<Int>.of(0, 1, 2, 3, 4, 5).window(timeSpan: 1, count: 3, scheduler: MainScheduler.instance).asObservable().subscribe(onNext: { (observable) in
    observable.subscribe(onNext: { value in
        print(value)
    }).disposed(by: disposeBag)
}, onCompleted: {
    print("completed")
}, onDisposed: {
    print("disposed")
}).disposed(by: disposeBag)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值