RxSwift詳解(2)-觀察變量的轉(zhuǎn)換(Trasforming Observables)

本章節(jié)將繼續(xù)為大家介紹Rx 的方法使用。

map

將變量A轉(zhuǎn)換為變量B

let originalSequence = Observable.of(Character("A"),Character("B"),Character("C"))
            _ = originalSequence.map{ char in
                return char.hashValue
            
                }.subscribeNext({ (vc) -> Void in
                    print(vc);
                    })
    }
/*


4799450059485597671
4799450059485597672
4799450059485597677
使用subscribe的輸出結(jié)果:
**Next(4799450059485597671)**
**Next(4799450059485597672)**
**Next(4799450059485597677)**
**Completed**
*/
flatMap

transform the items emitted by an Observable into Observables, then flatten the emissions from those into a single Observable

** The FlatMap operator transforms an Observable by applying a function that you specify to each item emitted by the source Observable, where that function returns an Observable that itself emits items. FlatMap then merges the emissions of these resulting Observables, emitting these merged results as its own sequence.
This method is useful, for example, when you have an Observable that emits a series of items that themselves have Observable members or are in other ways transformable into Observables, so that you can create a new Observable that emits the complete collection of items emitted by the sub-Observables of these items.
Note that FlatMap merges the emissions of these Observables, so that they may interleave.
In several of the language-specific implementations there is also an operator that does not interleave the emissions from the transformed Observables, but instead emits these emissions in strict order, often called ConcatMap or something similar.*

將sub-Observables 的結(jié)果合并到flatmap的sequence 中

func flattenMap(){
        let sequenceInt = Observable.of(1, 2, 3)
        
        let sequenceString = Observable.of("A", "B", "C", "D", "E", "F", "--")
        
        _ = sequenceInt
            .flatMap { (x:Int) -> Observable<String> in
                print("from sequenceInt \(x)")
                return sequenceString
            }
            .subscribe {
                print($0)
        }
        /*
        from sequenceInt 1
        Next(A)
        Next(B)
        Next(C)
        Next(D)
        Next(E)
        Next(F)
        Next(--)
        from sequenceInt 2
        Next(A)
        Next(B)
        Next(C)
        Next(D)
        Next(E)
        Next(F)
        Next(--)
        from sequenceInt 3
        Next(A)
        Next(B)
        Next(C)
        Next(D)
        Next(E)
        Next(F)
        Next(--)
        Completed
        */
    }
scan

給observable的每一個item 運用一個function ,并返回結(jié)果

scan(0)初始值 和一個accumulator

 - parameter seed: The initial accumulator value.
 - parameter accumulator: An accumulator function to be invoked on each element.
 - returns: An observable sequence containing the accumulated values.
        */
    @warn_unused_result(message="http://git.io/rxs.uo")
    public func scan<A>(seed: A, accumulator: (A, Self.E) throws -> A) -> RxSwift.Observable<A>
 func scan(){
        //  
        let sequenceToSum = Observable.of(0, 1, 2, 3, 4, 5)
        
        _ = sequenceToSum
            .scan(0) { acum, elem in
                acum + elem
            }
            .subscribe {
                print($0)
        }
    }
/*
Next(0)
Next(1)
Next(3)
Next(6)
Next(10)
Next(15)
Completed
*/
distinctUntilChanged

控制連續(xù)重復的item石窑,如果連續(xù)的item相同益兄,則不輸出

let subscription = Observable.of(1, 2, 3, 1, 1, 4)
        .distinctUntilChanged()
        .subscribe {
            print($0)
        }
distinct.png
take

只取前n 項

let subscription = Observable.of(1, 2, 3, 4, 5, 6)
        .take(3)
        .subscribe {
            print($0)
        }
startWith

在輸出序列之前,在序列前添加指定的序列項

// 在序列前依次添加序列項 0 挤悉,1,2,3
 func startWith(){
        let _ = Observable.of(4, 5, 6, 7, 8, 9)
            .startWith(3)
            .startWith(2)
            .startWith(1)
            .startWith(0)
            .subscribe {
                print($0)
        }
    }
/*

**Next(0)**
**Next(1)**
**Next(2)**
**Next(3)**
新添加的項

**Next(4)**
**Next(5)**
**Next(6)**
**Next(7)**
**Next(8)**
**Next(9)**
**Completed**
*/
combinlatest
func combinlasted(){
        let intOb1 = PublishSubject<String>()
        let intOb2 = PublishSubject<Int>()
        
        _ = Observable.combineLatest(intOb1, intOb2) {
            "\($0) \($1)"
            }
            .subscribe {
                print($0)
        }
        
        intOb1.on(.Next("A"))
        
       // intOb2.on(.Next(1))
        
        intOb1.on(.Next("B"))
        
        intOb2.on(.Next(2))
        /*
        Next(A 1)
        Next(B 1)
        Next(B 2)
        
        // 注銷  intOb2.on(.Next(1))
        Next(B 2)

        */
    }

另一版本

func combinLastedVer2(){
        let intOb1 = Observable.just(2)
        let intOb2 = Observable.of(0, 1, 2, 3, 4)
        
        _ = Observable.combineLatest(intOb1, intOb2) {
             "\($0) \($1)"
            }
            .subscribe {
                print($0)
                /*
                Next(2 0)
                Next(2 1)
                Next(2 2)
                Next(2 3)
                Next(2 4)
                Completed
                */
        }
    }
    
    func combinLastedVer3(){
        let intOb1 = Observable.just(2)
        let intOb2 = Observable.of(0, 1, 2, 3)
        let intOb3 = Observable.of(0, 1, 2, 3, 4)
        
        _ = Observable.combineLatest(intOb1, intOb2, intOb3) {
           "\($0) \($1) \($2)"
            }
            .subscribe {
                print($0)
                /*
                Next(2 3 0)
                Next(2 3 1)
                Next(2 3 2)
                Next(2 3 3)
                Next(2 3 4)
                Completed
                */
        }
    }

combinelatest.png
zip

將多個observable 的結(jié)果組合成一個并返回歉闰,但是必須每一個observable的item 要對應

    func zip1(){
        let intOb1 = PublishSubject<String>()
        let intOb2 = PublishSubject<Int>()
        
        _ = Observable.zip(intOb1, intOb2) {
            "\($0) \($1)"
            }
            .subscribe {
                print($0)
        }
        
        intOb1.on(.Next("A"))
        
        intOb2.on(.Next(1))
        
        intOb1.on(.Next("B"))
        
        intOb1.on(.Next("C"))
        
        intOb2.on(.Next(2))
        /*
        Next(A 1)
        Next(B 2)
        */
        
    }
    func zip2(){
        let intOb1 = Observable.just(2)
        
        let intOb2 = Observable.of(0, 1, 2, 3, 4)
        
        _ = Observable.zip(intOb1, intOb2) {
            "\($0) \($1)"
            }
            .subscribe {
                print($0)
                /*
                Next(2 0)
                Completed

                */
        }
        
    }
    func zip3(){
        let intOb1 = Observable.of(0, 1)
        let intOb2 = Observable.of(0, 1, 2, 3)
        let intOb3 = Observable.of(0, 1, 2, 3, 4)
        
        _ = Observable.zip(intOb1, intOb2, intOb3) {
            "\($0) \($1) \($2)"
            }
            .subscribe {
                print($0)
        }
        /*
        Next(0 0 0)
        Next(1 1 1)
        Completed

        */
    }
zip.png
merge

將Observable的item合并為一個

let subject1 = PublishSubject<Int>()
    let subject2 = PublishSubject<Int>()

    _ = Observable.of(subject1, subject2)
        .merge()
        .subscribeNext { int in
            print(int)
        }

    subject1.on(.Next(20))
    subject1.on(.Next(40))
    subject1.on(.Next(60))
    subject2.on(.Next(1))
    subject1.on(.Next(80))
    subject1.on(.Next(100))
    subject2.on(.Next(1))
func merge2(){
        let subject1 = PublishSubject<Int>()
        let subject2 = PublishSubject<Int>()
        
        _ = Observable.of(subject1, subject2)
            .merge(maxConcurrent: 1)// 如果2 則結(jié)果與上述相同
            .subscribe {
                print($0)
        }
        
        subject1.on(.Next(20))
        subject1.on(.Next(40))
        subject1.on(.Next(60))
        subject2.on(.Next(1))
        subject1.on(.Next(80))
        subject1.on(.Next(100))
        subject2.on(.Next(1))
        
        /*
        Next(20)
        Next(40)
        Next(60)
        Next(80)
        Next(100)
        */
    }
merge.png
switchlatest

Switch subscribes to an Observable that emits Observables. Each time it observes one of these emitted Observables, the Observable returned by Switch unsubscribes from the previously-emitted Observable begins emitting items from the latest Observable. Note that it will unsubscribe from the previously-emitted Observable when a new Observable is emitted from the source Observable, not when the new Observable emits an item. This means that items emitted by the previous Observable between the time the subsequent Observable is emitted and the time that subsequent Observable itself begins emitting items will be dropped (as with the yellow circle in the diagram above)

   func switchLatest(){
        let var1 = Variable(0)
        
        let var2 = Variable(200)
        
        // var3 is like an Observable<Observable<Int>>
        let var3 = Variable(var1.asObservable())
        
        let d = var3
            .asObservable()
            .switchLatest()
            .subscribe {
                print($0)
        }
        
        var1.value = 1
        var1.value = 2
        var1.value = 3
        var1.value = 4
        
        var3.value = var2.asObservable()
        
        var2.value = 201
        
        var1.value = 5
        var1.value = 6
        var1.value = 7
        
        /*
        Next(0)
        Next(1)
        Next(2)
        Next(3)
        Next(4)
        Next(200)
        Next(201)
        Completed
        */
    }
switch.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市卓起,隨后出現(xiàn)的幾起案子和敬,更是在濱河造成了極大的恐慌,老刑警劉巖戏阅,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昼弟,死亡現(xiàn)場離奇詭異,居然都是意外死亡奕筐,警方通過查閱死者的電腦和手機舱痘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來离赫,“玉大人芭逝,你說我怎么就攤上這事≡ㄐ兀” “怎么了旬盯?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長翎猛。 經(jīng)常有香客問我瓢捉,道長,這世上最難降的妖魔是什么办成? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任泡态,我火速辦了婚禮,結(jié)果婚禮上迂卢,老公的妹妹穿的比我還像新娘某弦。我一直安慰自己桐汤,他們只是感情好,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布靶壮。 她就那樣靜靜地躺著怔毛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腾降。 梳的紋絲不亂的頭發(fā)上拣度,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機與錄音螃壤,去河邊找鬼抗果。 笑死,一個胖子當著我的面吹牛奸晴,可吹牛的內(nèi)容都是我干的冤馏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼寄啼,長吁一口氣:“原來是場噩夢啊……” “哼逮光!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起墩划,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤涕刚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乙帮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體副女,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年蚣旱,在試婚紗的時候發(fā)現(xiàn)自己被綠了碑幅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡塞绿,死狀恐怖沟涨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情异吻,我是刑警寧澤裹赴,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站诀浪,受9級特大地震影響棋返,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雷猪,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一睛竣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧求摇,春花似錦射沟、人聲如沸殊者。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猖吴。三九已至,卻和暖如春挥转,著一層夾襖步出監(jiān)牢的瞬間海蔽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工绑谣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留党窜,地道東北人。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓域仇,卻偏偏與公主長得像刑然,于是被迫代替她去往敵國和親寺擂。 傳聞我的和親對象是個殘疾皇子暇务,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 一、Rxjava環(huán)境配置 使用android studio怔软,gradle腳本中加入依賴: 二垦细、示例 Rxjava基...
    Cui三土閱讀 582評論 2 5
  • 而總有一天你會明白,善良比聰明更難挡逼。 因為聰明只是一種天賦括改。 而善良,卻是一種選擇家坎。 在某地方看到這樣寫著嘱能。想:面...
    京呀呀閱讀 234評論 0 0
  • 女人的妝容畫出了她的性格 喜歡時髦妝容的人,能很快的接受新鮮的事物虱疏。 喜歡濃妝艷抹的人惹骂,自我表現(xiàn)欲望強烈,她們希望...
    易秒閱讀 205評論 2 0
  • 每一次從夢中醒來做瞪,都覺得自己在夢里力竭心疲对粪。隱隱還記得自己在夢里傻逼的模樣,歇斯底里的吶喊卻讓自己更累了装蓬,自己都覺...
    疏碧湖的砍柴人閱讀 397評論 1 3
  • 茫茫人海中,很多很多都是匆匆過客暗赶,很多很多都是一面之交峦萎,在你的記憶里屡久,有多少人給你回眸一笑?有多少人會駐守長...
    東江之子閱讀 511評論 0 1