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) }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容