RxSwift - 理論篇04 - Transform Operators

1、map

(1)Definition

英文原意:
Applies a transforming closure to elements emitted by an Observable sequence, 
and returns a new Observable sequence of the transformed elements.

1> 有一個 Observable sequence 發(fā)出 elements
2> map 函數(shù)提供一個 '轉換閉包',對上述 elements 進行轉換
3> 返回一個新的 Observable sequence怒炸,由轉換后的 elements 組成

(2)Diagrams

map.png
1> 初始的 elements 是: 1翘魄、2最筒、3
2> map 函數(shù)提供轉換閉包: x => 10 * x
3> 轉換后的 elements 是:  10水慨、20、30

(3)Code

// MARK: - map
func demoForMap() {
    
    let disposeBag = DisposeBag()
    
    let observable = Observable.of(1, 2, 3)
    
    observable
        .map({ $0 * $0 })
        .subscribe(onNext: { print($0) })
        .addDisposableTo(disposeBag)
}

(4)Result

map 執(zhí)行結果.png

2叨襟、flatMap

(1)Definition

(2)Diagrams

flatMap.png
1> source observable 是 Observable<Int> 類型
2> flatMap 獲取到 source obserable 的第一個 element繁扎,取出 value,對其做 '乘10' 操作
3> 將轉換后的 element糊闽,重新投影到一個 observable 中(即 flatMap下面的第一條線)
4> target observable 將 element 發(fā)送給 subcriber(訂閱者)
5> 之后梳玫,第一個 element 的值變?yōu)?,轉換后變成40墓怀,再由 target observable 發(fā)送給 subcriber
6> 第二個汽纠、第三個 element 與之類似,不再詳述傀履。

(3)Code

// MARK: - flatMap
func demoForFlatMap() {
    
    struct Student {
        var score: Variable<Int>
    }
    
    let disposeBag = DisposeBag()
    
    // 1 創(chuàng)建兩個 Student 的實例: jack 和 rose
    let jack = Student(score: Variable(80))
    let rose = Student(score: Variable(90))
    
    // 2 創(chuàng)建一個 Student 類型的 Variable虱朵,初始值為 jack
    let student = Variable(jack)
    
    // 3 通過 flatMap 訪問到 score
    student.asObservable()
        .flatMap {
            $0.score.asObservable()
        }
        // 4 打印 onNext 事件的 element
        .subscribe(onNext: {
            print($0)
        })
        .addDisposableTo(disposeBag)
    
    jack.score.value = 85
    
    student.value = rose
    
    jack.score.value = 95
    rose.score.value = 100
}

(4)Result

flatMap 執(zhí)行結果.png

3、flatMapLatest

(1)Definition

(2)Diagram

flatMapLatest.png
1> 01 被 flatMapLatest 接收钓账,將其值轉換為10碴犬,并將其投影到01的新 observable 中
2> 02 被 flatMapLatest 接收時,20對應的 observable 成為 latest observable梆暮,這個時候服协,即使 01 變成了 30,也不會被發(fā)送給 subcriber啦粹,因為此時它不在 latest observable 中
3> 03 的情況偿荷,以此類推

(3)Code

// MARK: - flatMapLatest
func demoForFlatMapLatest() {

struct Student {
    var score: Variable<Int>
}

let disposeBag = DisposeBag()

// 1 創(chuàng)建兩個 Student 的實例: jack 和 rose
let jack = Student(score: Variable(80))
let rose = Student(score: Variable(90))

// 2 創(chuàng)建一個 Student 類型的 Variable窘游,初始值為 jack
let student = Variable(jack)

// 3 通過 flatMapLatest 訪問到 score
student.asObservable()
    .flatMapLatest {
        $0.score.asObservable()
    }
    // 4 打印 onNext 事件的 element
    .subscribe(onNext: {
        print($0)
    })
    .addDisposableTo(disposeBag)

jack.score.value = 85

student.value = rose

jack.score.value = 95
rose.score.value = 100

}

(4)Result

flatMapLatest 執(zhí)行結果.png

4、scan

(1)Definition

(2)Diagram

scan.png

(3)Code

// MARK: - scan
func demoForScan() {
    
    let disposeBag = DisposeBag()
    
    let observable = Observable.of(10, 100, 1000)
    observable
        .scan(2, accumulator: { aggregateValue, newValue in
            aggregateValue + newValue
        })
        .subscribe(onNext: { print($0) })
        .addDisposableTo(disposeBag)
}

(4)Result

scan 執(zhí)行結果.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末跳纳,一起剝皮案震驚了整個濱河市忍饰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寺庄,老刑警劉巖艾蓝,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斗塘,居然都是意外死亡赢织,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門馍盟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來于置,“玉大人,你說我怎么就攤上這事朽合【懔剑” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵曹步,是天一觀的道長。 經常有香客問我休讳,道長讲婚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任俊柔,我火速辦了婚禮筹麸,結果婚禮上,老公的妹妹穿的比我還像新娘雏婶。我一直安慰自己物赶,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布留晚。 她就那樣靜靜地躺著酵紫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪错维。 梳的紋絲不亂的頭發(fā)上奖地,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音赋焕,去河邊找鬼参歹。 笑死,一個胖子當著我的面吹牛隆判,可吹牛的內容都是我干的犬庇。 我是一名探鬼主播僧界,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼臭挽!你這毒婦竟也來了捎泻?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤埋哟,失蹤者是張志新(化名)和其女友劉穎笆豁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赤赊,經...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡闯狱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抛计。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哄孤。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吹截,靈堂內的尸體忽然破棺而出瘦陈,到底是詐尸還是另有隱情,我是刑警寧澤波俄,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布晨逝,位于F島的核電站,受9級特大地震影響懦铺,放射性物質發(fā)生泄漏捉貌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一冬念、第九天 我趴在偏房一處隱蔽的房頂上張望趁窃。 院中可真熱鬧,春花似錦急前、人聲如沸醒陆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刨摩。三九已至,卻和暖如春据块,著一層夾襖步出監(jiān)牢的瞬間码邻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工另假, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留像屋,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓边篮,卻偏偏與公主長得像己莺,于是被迫代替她去往敵國和親奏甫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內容