RxSwift(一)

empty,它會發(fā)送一個 Completed 事件罪郊,創(chuàng)建一個不發(fā)射任何數(shù)據(jù)但是正常終止的 Observable

// empty
        let emptySeq: Observable<Int> = empty()
        let subscription = emptySeq.subscribe { event in
            print(event)
        }
        // 輸出Completed

never 不會發(fā)送任何事件啡氢,創(chuàng)建一個不發(fā)射數(shù)據(jù)也不終止的 Observable

// never 
        let neverSeq: Observable<String> = never()
        let subscription = neverSeq.subscribe { event in
            print(event)
        }
        // 什么都沒用打印

just,會先發(fā)送Next(Value)杉允,然后發(fā)送 Completed,創(chuàng)建一個發(fā)射指定值的 Observable住练。

Paste_Image.png
// just
        let justSeq = just("RxSwift")
        let subscription = justSeq.subscribe { event in
            print(event)
        }
        // 打印
        // Next(RxSwift)
        // Completed

sequenceOf 把一系列元素轉(zhuǎn)換為事件

// sequenceOf
        let sequenceElements = sequenceOf(1, 2, 3, 4)
        let subscription = sequenceElements.subscribe { event in
            print(event)
        }

from 通過 asObservable限嫌,把其他數(shù)據(jù)類型轉(zhuǎn)換為 Observable

Paste_Image.png
// asObservable, 把序列轉(zhuǎn)換成Observable
        let sequenceFromArray = [1, 2, 3, 4].asObservable()
        let subscription = sequenceFromArray.subscribe { event in
            print(event)
        }
        // 輸出
        // Next(1)
        // Next(2)
        // Next(3)
        // Next(4)
        // Completed

create,通過它重新創(chuàng)建一個Observable,通過.on發(fā)射Next和Completed事件

Paste_Image.png
// create創(chuàng)建序列褪贵,通過.on添加事件
        let myCreate = { (element: Int) -> Observable<Int> in
            return create { observer in
                observer.on(.Next(element))
                observer.on(.Completed)
                return NopDisposable.instance
            }
        }
        let subscription = myCreate(1).subscribe { event in
            print(event)
        }
        // 輸出
        // Next(1)
        // Completed

failWith

// failWith掂之,只會發(fā)送Error事件
        let error = NSError(domain: "error", code: 1001, userInfo: nil)
        let errorSeq: Observable<Int> = failWith(error)
        let subscription = errorSeq.subscribe { event in
            print(event)
        }
        // 輸出
        // Error(Error Domain=error Code=1001 "(null)")

deferred 直到有訂閱者訂閱才創(chuàng)建 Observable,并為每一個訂閱者創(chuàng)建一個新的 Observable,在某些情況下脆丁,要等到最后一分鐘才能獲取到最新的數(shù)據(jù)世舰,就需要這樣做

Paste_Image.png
// deferred 會等到有訂閱者,訂閱它才創(chuàng)建Observable
        let deferredSeq: Observable<Int> = deferred {
            print("create")
            return create { observer in
                observer.on(.Next(0))
                observer.on(.Next(1))
                observer.on(.Next(2))
                return NopDisposable.instance
            }
        }
        deferredSeq.subscribe { event in
            print(event)
        }
        /*
        create
        Next(0)
        Next(1)
        Next(2)
        */

Subjects

PublishSubject

// PublishSubject,會發(fā)送從訂閱者槽卫,訂閱之后的事件
        let subject = PublishSubject<String>()
        subject.subscribe { event in
            print("1->\(event)")
        }
        subject.on(.Next("a"))
        subject.on(.Next("b"))
        subject.subscribe { event in
            print("2->\(event)")
        }
        subject.on(.Next("c"))
        // 輸出
        /*
        1->Next(a)
        1->Next(b)
        1->Next(c)
        2->Next(c)
        */
Paste_Image.png

BehaviorSubject

// BehaviorSubject 它開始發(fā)射原始 Observable 最近發(fā)射的數(shù)據(jù)跟压,然后繼續(xù)發(fā)送其他來自O(shè)bservable的數(shù)據(jù)
        let subject = BehaviorSubject(value: "z")
        subject.subscribe { event in
            print("1->\(event)")
        }
        subject.on(.Next("a"))
        subject.on(.Next("b"))
        subject.subscribe { event in
            print("2->\(event)")
        }
        subject.on(.Next("c"))
        subject.on(.Completed)
        // 輸出
        1->Next(a)
        1->Next(b)
        1->Next(c)
        2->Next(c)
Paste_Image.png

ReplaySubject

// ReplaySubject,當(dāng)有訂閱者,訂閱了的時候他能重發(fā)事件歼培,bufferSize指定重發(fā)的次數(shù),補發(fā)1次
        let subject = ReplaySubject<String>.create(bufferSize: 1)
        subject.subscribe { event in
            print("1->\(event)")
        }
        subject.on(.Next("a"))
        subject.on(.Next("b"))
        subject.subscribe { event in
            print("2->\(event)")
        }
        subject.on(.Next("c"))
        // 輸出
        /*
        1->Next(a)
        1->Next(b)
        2->Next(b)
        1->Next(c)
        2->Next(c)
        */
Paste_Image.png

Transform

map

Paste_Image.png
// map,通過對Observable發(fā)射映射的函數(shù)對每一項做轉(zhuǎn)換
        let originalSeq = sequenceOf(1, 2, 3)
        originalSeq.map { $0 * 2 }.subscribe { print($0) }
        /*
        輸出
        Next(2)
        Next(4)
        Next(6)
        Completed
        */

flatMap

// flatMap將一個發(fā)射數(shù)據(jù)的Observable變換為多個Observables震蒋,然后將它們發(fā)射的數(shù)據(jù)合并后放進一個單獨的Observable
        let seqInt = sequenceOf(1, 2, 3)
        let seqString = sequenceOf("a", "b", "c")
        seqInt.flatMap { int in seqString }.subscribe { print($0) }
        /*
        Next(a)
        Next(b)
        Next(c)
        Next(a)
        Next(b)
        Next(c)
        Next(a)
        Next(b)
        Next(c)
        Completed
        */

scan

Paste_Image.png
// scan連續(xù)的對序列中的元素應(yīng)用某一個元素。然后把結(jié)果作為下一次的輸入
        let seqToSum = sequenceOf(1, 2, 3, 4)
        seqToSum.scan(0) { (sum, ele) -> Int in
            sum + ele
            }.subscribe { print($0) }
        /*
        輸入
        Next(1)
        Next(3)
        Next(6)
        */

Filtering

Paste_Image.png
// filter,過濾不符合要求的元素
        let seq = sequenceOf(0, 1, 2, 3, 4, 5, 6, 7, 8)
        seq.filter { $0 % 2 == 0 }
            .subscribe { print($0) }
        /*
        輸出
        Next(0)
        Next(2)
        Next(4)
        Next(6)
        Next(8)
        Completed
        */

distinct

// distinct,去掉相鄰的相同元素
        let seq = sequenceOf(1, 2, 2, 2, 3, 1, 1, 4, 1, 4)
        seq.distinctUntilChanged().subscribe { print($0) }
        /*
        輸出
        Next(1)
        Next(2)
        Next(3)
        Next(1)
        Next(4)
        Next(1)
        Next(4)
        Completed
        */

take

// take保留前幾項的數(shù)據(jù)
        let subscription = sequenceOf(1, 2, 3, 4 , 5).take(3).subscribe { print($0) }
        /*
        Next(1)
        Next(2)
        Next(3)
        Completed
        */

Combining(組合操作)

startWith

// startWith在數(shù)據(jù)序列前出入指定數(shù)據(jù)
        let subscription = sequenceOf(2, 3, 4, 5).startWith(1).subscribe { print($0) }
        /*
        Next(1)
        Next(2)
        Next(3)
        Next(4)
        Next(5)
        Completed
        */

combineLatest

Paste_Image.png
// combineLatest躲庄,當(dāng)兩個Observables中任意一個發(fā)送了數(shù)據(jù)查剖,使用一個函數(shù)把兩個Observable中最近的數(shù)據(jù)進行結(jié)合
        let stringOb = PublishSubject<String>()
        let intOb = PublishSubject<Int>()
        combineLatest(stringOb, intOb) {
            "\($0) \($1)"
            }.subscribe { print($0) }
        stringOb.on(.Next("A"))
        intOb.on(.Next(1))
        stringOb.on(.Next("B"))
        stringOb.on(.Next("C"))
        /*
        Next(A 1)
        Next(B 1)
        Next(C 1)
        */

zip

Paste_Image.png
// zip它會等到Observable中的數(shù)據(jù)一一對應(yīng)結(jié)合時,再發(fā)送數(shù)據(jù)
        let stringOb = PublishSubject<String>()
        let intOb = PublishSubject<Int>()
        zip(stringOb, intOb) { "\($0) \($1)" }.subscribe { print($0) }
        stringOb.on(.Next("A"))
        stringOb.on(.Next("B"))
        intOb.on(.Next(1))
        intOb.on(.Next(2))

merge

Paste_Image.png
        // merge噪窘,合并對個Observables的發(fā)射物
        let subject1 = PublishSubject<Int>()
        let subject2 = PublishSubject<Int>()
        sequenceOf(subject1, subject2).merge().subscribe { print($0) }
        subject1.onNext(1)
        subject2.onNext(2)
        subject1.onNext(3)
        /*
        Next(1)
        Next(2)
        Next(3)
        */

switchLatest

// switchLatest,將一個Observable<Observable<T>>轉(zhuǎn)為為這樣的Observable,它逐個發(fā)射數(shù)據(jù)的Observable
        let var1 = Variable(0)
        let var3 = Variable(var1)
        let d = var3.switchLatest().subscribe { print($0) }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笋庄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子倔监,更是在濱河造成了極大的恐慌直砂,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浩习,死亡現(xiàn)場離奇詭異静暂,居然都是意外死亡,警方通過查閱死者的電腦和手機谱秽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門籍嘹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闪盔,“玉大人弯院,你說我怎么就攤上這事辱士。” “怎么了听绳?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵颂碘,是天一觀的道長。 經(jīng)常有香客問我椅挣,道長头岔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任鼠证,我火速辦了婚禮峡竣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘量九。我一直安慰自己适掰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布荠列。 她就那樣靜靜地躺著类浪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肌似。 梳的紋絲不亂的頭發(fā)上费就,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音川队,去河邊找鬼力细。 笑死,一個胖子當(dāng)著我的面吹牛固额,可吹牛的內(nèi)容都是我干的眠蚂。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼对雪,長吁一口氣:“原來是場噩夢啊……” “哼河狐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瑟捣,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤馋艺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迈套,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捐祠,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年桑李,在試婚紗的時候發(fā)現(xiàn)自己被綠了踱蛀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窿给。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖率拒,靈堂內(nèi)的尸體忽然破棺而出崩泡,到底是詐尸還是另有隱情,我是刑警寧澤猬膨,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布角撞,位于F島的核電站,受9級特大地震影響勃痴,放射性物質(zhì)發(fā)生泄漏谒所。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一沛申、第九天 我趴在偏房一處隱蔽的房頂上張望劣领。 院中可真熱鬧,春花似錦铁材、人聲如沸尖淘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽德澈。三九已至,卻和暖如春固惯,著一層夾襖步出監(jiān)牢的瞬間梆造,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工葬毫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留镇辉,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓贴捡,卻偏偏與公主長得像忽肛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子烂斋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

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