天天看點

RxSwift(一)

文/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。

RxSwift(一)

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

RxSwift(一)

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事件

RxSwift(一)

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,在某些情況下,要等到最後一分鐘才能擷取到最新的資料,就需要這樣做

RxSwift(一)

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")) // 輸出

RxSwift(一)

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)

RxSwift(一)

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")) // 輸出

RxSwift(一)

Paste_Image.png

Transform

map

RxSwift(一)

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

RxSwift(一)

Paste_Image.png

// scan連續的對序列中的元素應用某一個元素。然後把結果作為下一次的輸入 let seqToSum = sequenceOf(1, 2, 3, 4) seqToSum.scan(0) { (sum, ele) -> Int in sum + ele }.subscribe { print($0) }

Filtering

RxSwift(一)

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

RxSwift(一)

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

RxSwift(一)

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

RxSwift(一)

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

上一篇: RxSwift淺析