RxSwift(一)

empty,它會發送一個 Completed 事件,創建一個不發射任何數據但是正常終止的 Observable

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

never 不會發送任何事件,創建一個不發射數據也不終止的 Observable

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

just,會先發送Next(Value),然后發送 Completed,創建一個發射指定值的 Observable。

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

sequenceOf 把一系列元素轉換為事件

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

from 通過 asObservable,把其他數據類型轉換為 Observable

Paste_Image.png
// asObservable, 把序列轉換成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,通過它重新創建一個Observable,通過.on發射Next和Completed事件

Paste_Image.png
// create創建序列,通過.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,只會發送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 直到有訂閱者訂閱才創建 Observable,并為每一個訂閱者創建一個新的 Observable,在某些情況下,要等到最后一分鐘才能獲取到最新的數據,就需要這樣做

Paste_Image.png
// deferred 會等到有訂閱者,訂閱它才創建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,會發送從訂閱者,訂閱之后的事件
        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 它開始發射原始 Observable 最近發射的數據,然后繼續發送其他來自Observable的數據
        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,當有訂閱者,訂閱了的時候他能重發事件,bufferSize指定重發的次數,補發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發射映射的函數對每一項做轉換
        let originalSeq = sequenceOf(1, 2, 3)
        originalSeq.map { $0 * 2 }.subscribe { print($0) }
        /*
        輸出
        Next(2)
        Next(4)
        Next(6)
        Completed
        */

flatMap

// flatMap將一個發射數據的Observable變換為多個Observables,然后將它們發射的數據合并后放進一個單獨的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連續的對序列中的元素應用某一個元素。然后把結果作為下一次的輸入
        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保留前幾項的數據
        let subscription = sequenceOf(1, 2, 3, 4 , 5).take(3).subscribe { print($0) }
        /*
        Next(1)
        Next(2)
        Next(3)
        Completed
        */

Combining(組合操作)

startWith

// startWith在數據序列前出入指定數據
        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,當兩個Observables中任意一個發送了數據,使用一個函數把兩個Observable中最近的數據進行結合
        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中的數據一一對應結合時,再發送數據
        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的發射物
        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>>轉為為這樣的Observable,它逐個發射數據的Observable
        let var1 = Variable(0)
        let var3 = Variable(var1)
        let d = var3.switchLatest().subscribe { print($0) }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容