RxSwift筆記三組合序列

砳砳發表於2018-03-20

簡介

git地址: https://github.com/ReactiveX/RxSwift
    參考資料:http://t.swift.gg/d/2-rxswift
    
    ReactiveX是通過可觀察的流實現非同步程式設計的一種API,它結合了觀察者模式、迭代器模式和函數語言程式設計的精華,RxSwift 是 ReactiveX 程式設計思想的一種實現。
複製程式碼

startWith

RxSwift筆記三組合序列

let subscription = Observable.of(4, 5, 6, 7, 8, 9)
    .startWith(3)
    .startWith(2)
    .subscribe {
        print($0)
}
///列印:2,3,4, 5, 6, 7, 8, 9
複製程式碼

combineLatest

當兩個序列任意一個傳送資料時,combineLatest會結合並整理每個序列發射的最近資料項。
複製程式碼

RxSwift筆記三組合序列

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))

///輸出:(A 1) (B 1) (B 2)
複製程式碼
  • 我們都要去傳入 resultSelector 這個引數,一般我們做尾隨閉包,這個是對兩(多)個序列值的處理方式,上面的例子就是將序列一和二的值變成字串,中間加個空格,外面再包一個() .
  • Rx 在 combineLatest 上的實現,只能結合 8 個序列。再多的話就要自己去拼接了。
let intOb1 = Observable.just(2)
let intOb2 = ReplaySubject<Int>.create(bufferSize: 1)
intOb2.onNext(0)
let intOb3 = Observable.of(0, 1, 2, 3, 4)
intOb2.onNext(1)
    
_ = Observable.combineLatest(intOb1, intOb2, intOb3) {
    "\($0) \($1) \($2)"
    }
    .subscribe {
        print($0)
}
intOb2.onNext(2)
intOb2.onNext(3)

///輸出: "210","211","212","213","214","224","234"
複製程式碼
let intOb1 = Observable.just(2)
let intOb2 = Observable.of(0, 1, 2, 3)
let intOb3 = Observable.of(0, 1, 2, 3, 4)

_ = [intOb1, intOb2, intOb3].combineLatest { intArray -> Int in
    Int((intArray[0] + intArray[1]) * intArray[2])
    }
    .subscribe { (event: Event<Int>) -> Void in
        print(event)
    }
    
    next(2)
    next(2)
    next(3)
    next(4)
    next(6)
    next(8)
    next(11)
    next(14)
    completed
複製程式碼

zip

RxSwift筆記三組合序列
zip 與 combineLatest 的區別是每當所有序列都發射一個值時, zip 才會傳送一個值。它會等待每一個序列發射值,發射次數由最短序列決定。結合的值都是一一對應的。

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)
    }
複製程式碼

merge

merge是將多個序列合併成一個序列,序列傳送的資料按照先後順序合併,merge合併的是序列,也就是說序列傳送序列才能使用merge.
複製程式碼

RxSwift筆記三組合序列

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

_ = Observable.of(subject1, subject2)
    .merge(maxConcurrent: 2)
    .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))
複製程式碼

switchLatest

switchLatest 和 merge 有一點相似,都是用來合併序列的。然而這個合併並非真的是合併序列。事實是每當發射一個新的序列時,丟棄上一個發射的序列.
複製程式碼

RxSwift筆記三組合序列

let var1 = Variable(0)
    
let var2 = Variable(200)
    
// var3 是一個 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 發射的值都會被忽略
var1.value = 6
var1.value = 7
複製程式碼

相關文章