RxSwift (3) 组合符号

9 篇文章 0 订阅

startWith

在开始发出订阅信号前,按照后进先出原则,发出指定的信号

    func rx_operators_startWith(){
        let disposeBag = DisposeBag()

        // 观察量序列 of是固定元素的观察序列
        var ofObservable = Observable.of("制服","丝袜","吊带","短裙")

        // startWith 订阅前添加
        ofObservable = ofObservable.startWith("都穿上")
        ofObservable = ofObservable.startWith("换一下衣服")
        ofObservable = ofObservable.startWith("老板娘","把妹妹们都喊出来")

        // 订阅
        ofObservable.subscribe { print("\($0)")
        }.addDisposableTo(disposeBag)


        // 这是拆解开来写,下面是组合 示范

        // 观察量序列 of是固定元素的观察序列
//        Observable.of("制服","丝袜","吊带","短裙")
//            
//            // startWith 订阅前添加
//            .startWith("都穿上")
//            .startWith("换一下衣服")
//            .startWith("老板娘","把妹妹们都喊出来")
//            
//            // 订阅
//            .subscribe { print("\($0)")
//            }.addDisposableTo(disposeBag)
    }
打印结果
next(老板娘)
next(把妹妹们都喊出来)
next(换一下衣服)
next(都穿上)
next(制服)
next(丝袜)
next(吊带)
next(短裙)
completed

merge

用一个 订阅者,同时订阅多个 观察量序列的 信号

将多个观察量序列(observable)比如a,b,c 合并为一个观察者(observe)序列s,当a、b、c任何一个序列发出信号的时候,s里,都接收个信号

 func rx_operators_merge(){
        let disposeBag = DisposeBag()

        // 传入一个元素,生成一个 发送元素信号的观察量序列
        let aObservable = { (x:String)->Observable<String> in
            return Observable<String>.create{ observe in

                observe.onNext(x)

                return Disposables.create {
                    print("a  结束")
                }
            }

        }

        let bObservable = { (x:String)->Observable<String> in
            return Observable<String>.create{ observe in

                observe.onNext(x)

                return Disposables.create {
                    print("b  结束")
                }
            }

        }


        let cObservable = { (x:String)->Observable<String> in
            return Observable<String>.create{ observe in

                observe.onNext(x)

                return Disposables.create {
                    print("c  结束")
                }
            }

        }

        // 合成
        Observable.from([aObservable("a萝莉"),bObservable("b御姐"),cObservable("c少妇")])
        // 关键代码 合成
        .merge()
        // 订阅
        .subscribe(onNext:{print($0)})
        .addDisposableTo(disposeBag)

    }
打印:
a萝莉
b御姐
c少妇
a  结束
b  结束
c  结束

zip

压缩合成,最多合成8个观察量序列,合成的几个 序列中,必须多个序列的同一次 信号发送必须有值,否则不发送


    func rx_operators_zip(){
        let disposeBag = DisposeBag()

        let aObservable = Observable<String>.create({observe in
            observe.onNext("美腿")

            return Disposables.create()
        })

        let bObservable = Observable<String>.create({observe in

            observe.onNext("丝袜")
            observe.onNext("制服")

            return Disposables.create()
        })

        let cObservable = Observable<String>.create({observe in

            observe.onNext("超短裙")
            observe.onNext("诱惑")
            observe.onNext("很不错")

            return Disposables.create()
        })

        //压缩  合成
        Observable.zip(aObservable, bObservable, cObservable) { (a, b, c)  in
            a+b+c
            }.subscribe (onNext:{
            print($0)
        }).addDisposableTo(disposeBag)
    }

打印结果:美腿丝袜超短裙

combineLatest

合成观察量序列,多8个,只要其中一个观察量序列 发出信号,那么这个合成序列就会采集所有序列目前最新的信号,合起来发送一次。

func rx_operators_combineLatest(){
        let disposeBag = DisposeBag()

        let aObservable = Observable.of("0","小朋友","萝莉")
        let bObservable = Observable.of("1","2","3","白丝")
        let cObservable = Observable.of("正义","欲望","邪恶","高尚")

        Observable.combineLatest(aObservable,bObservable,cObservable) { a,b,c in
            a+b+c
            }.subscribe{
                print($0)}.addDisposableTo(disposeBag)


    }
打印结果:
next(01正义)
next(小朋友1正义)
next(小朋友2正义)
next(小朋友2欲望)
next(萝莉2欲望)
next(萝莉3欲望)
next(萝莉3邪恶)
next(萝莉白丝邪恶)
next(萝莉白丝高尚)
completed

你会发现打印结果找不出来规律,是因为3个of发送信号不是串行的。你可以自己create几个序列试试哦。

switchLatest

订阅 2维 观察量序列,也就是 观察量序列里面 发送的信号也是观察量序列,将其转换为一个可以切换订阅序列的一维序列,当切换到新的序列的时候,旧订阅将取消

func rx_operators_switchLatest(){
        let disposeBag = DisposeBag()

        let aObservable = Observable<String>.create{observe in

            observe.onNext("女仆")
            observe.onNext("诱人")

            observe.onCompleted()

            return Disposables.create()
        }

        let bObservable = Observable<String>.create{observe in

            observe.onNext("萝莉")
            observe.onNext("音清体柔易推倒")

            observe.onCompleted()

            return Disposables.create{print("取消")}
        }

        let cObservable = Observable<Observable<String>>.create{ observe in
            observe.onNext(aObservable)
            observe.onNext(bObservable)

            observe.onCompleted()

            return Disposables.create()
        }

        Observable.of(aObservable,bObservable)
        .switchLatest()
        .subscribe {
            print($0)
        }
        .addDisposableTo(disposeBag)

        print("——————————————1111——————————————————————")
        cObservable.switchLatest()
        .subscribe{
        print($0)
        }
        .addDisposableTo(disposeBag)
        print("——————————————2222——————————————————————")


        let  vab = Variable(aObservable)

        vab.asObservable()
            .switchLatest()
            .subscribe(onNext:{print($0)})
            .addDisposableTo(disposeBag)

        // 切换到b
        vab.value = bObservable

        // 切换到a
        vab.value = aObservable

        print("———————————3333—————————————————————————")

        let aSubject = PublishSubject<String>()
        let bSubject = PublishSubject<String>()

        let variab = Variable(aSubject)

        variab.asObservable()
            .switchLatest()
            .subscribe{print($0)}
            .addDisposableTo(disposeBag)

        aSubject.onNext("萌萌哒小萝莉")
        bSubject.onNext("小苹果儿")

        //切换订阅
        variab.value = bSubject

        bSubject.onNext("皮皮虾我们走")
        aSubject.onNext("怪蜀黍")
        bSubject.onNext("哈哈哈")

        //再切换一次
        variab.value = aSubject

        aSubject.onNext("~~~!!!@@@")
        aSubject.onNext("制服诱惑")
        bSubject.onNext("看看结果")




    }
打印结果:
next(女仆)
next(诱人)
next(萝莉)
next(音清体柔易推倒)
取消
completed
——————————————1111——————————————————————
next(女仆)
next(诱人)
next(萝莉)
next(音清体柔易推倒)
取消
completed
——————————————2222——————————————————————
女仆
诱人
萝莉
音清体柔易推倒
取消
女仆
诱人
———————————3333—————————————————————————
next(萌萌哒小萝莉)
next(皮皮虾我们走)
next(哈哈哈)
next(~~~!!!@@@)
next(制服诱惑)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值