文/iOS_Deve(簡書作者)
原文連結:http://www.jianshu.com/p/429b5160611f
著作權歸作者所有,轉載請聯系作者獲得授權,并标注“簡書作者”。
1.empty,它會發送一個Completed事件,建立一個不發射任何資料但是正常終止的Observable
// empty let emptySeq: Observable<Int> = empty() let subscription = emptySeq.subscribe { event in print(event) } // 輸出Completed
2.never不會發送任何事件,建立一個不發射資料也不終止的Observable
// never let neverSeq: Observable<String> = never() let subscription = neverSeq.subscribe { event in print(event) } // 什麼都沒用列印
3.just,會先發送Next(Value),然後發送Completed,建立一個發射指定值的Observable。
Paste_Image.png
// just let justSeq = just("RxSwift") let subscription = justSeq.subscribe { event in print(event) } // 列印 // Next(RxSwift) // Completed
4.sequenceOf把一系列元素轉換為事件
// sequenceOf let sequenceElements = sequenceOf(1, 2, 3, 4) let subscription = sequenceElements.subscribe { event in print(event) }
5.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
6.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
7
// 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)")
8.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) }
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")) // 輸出
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")) // 輸出
Paste_Image.png
Transform
map
Paste_Image.png
// map,通過對Observable發射映射的函數對每一項做轉換 let originalSeq = sequenceOf(1, 2, 3) originalSeq.map { $0 * 2 }.subscribe { print($0) }
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) }
scan
Paste_Image.png
// scan連續的對序列中的元素應用某一個元素。然後把結果作為下一次的輸入 let seqToSum = sequenceOf(1, 2, 3, 4) seqToSum.scan(0) { (sum, ele) -> Int in sum + ele }.subscribe { print($0) }
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) }
distinct
// distinct,去掉相鄰的相同元素 let seq = sequenceOf(1, 2, 2, 2, 3, 1, 1, 4, 1, 4) seq.distinctUntilChanged().subscribe { print($0) }
take
// take保留前幾項的資料 let subscription = sequenceOf(1, 2, 3, 4 , 5).take(3).subscribe { print($0) }
Combining(組合操作)
startWith
// startWith在資料序列前出入指定資料 let subscription = sequenceOf(2, 3, 4, 5).startWith(1).subscribe { print($0) }
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"))
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)
switchLatest
// switchLatest,将一個Observable<Observable<T>>轉為為這樣的Observable,它逐個發射資料的Observable let var1 = Variable(0) let var3 = Variable(var1) let d = var3.switchLatest().subscribe { print($0) }