在开始发出订阅信号前,按照后进先出原则,发出指定的信号
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用一个 订阅者,同时订阅多个 观察量序列的 信号
将多个观察量序列(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 结束压缩合成,最多合成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) }打印结果:美腿丝袜超短裙
合成观察量序列,多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几个序列试试哦。
订阅 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(制服诱惑)