empty
,它會發(fā)送一個 Completed 事件罪郊,創(chuàng)建一個不發(fā)射任何數(shù)據(jù)但是正常終止的 Observable
// empty
let emptySeq: Observable<Int> = empty()
let subscription = emptySeq.subscribe { event in
print(event)
}
// 輸出Completed
never
不會發(fā)送任何事件啡氢,創(chuàng)建一個不發(fā)射數(shù)據(jù)也不終止的 Observable
// never
let neverSeq: Observable<String> = never()
let subscription = neverSeq.subscribe { event in
print(event)
}
// 什么都沒用打印
just
,會先發(fā)送Next(Value)杉允,然后發(fā)送 Completed,創(chuàng)建一個發(fā)射指定值的 Observable住练。
Paste_Image.png
// just
let justSeq = just("RxSwift")
let subscription = justSeq.subscribe { event in
print(event)
}
// 打印
// Next(RxSwift)
// Completed
sequenceOf
把一系列元素轉(zhuǎn)換為事件
// sequenceOf
let sequenceElements = sequenceOf(1, 2, 3, 4)
let subscription = sequenceElements.subscribe { event in
print(event)
}
from
通過 asObservable限嫌,把其他數(shù)據(jù)類型轉(zhuǎn)換為 Observable
Paste_Image.png
// asObservable, 把序列轉(zhuǎn)換成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
,通過它重新創(chuàng)建一個Observable,通過.on發(fā)射Next和Completed事件
Paste_Image.png
// create創(chuàng)建序列褪贵,通過.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掂之,只會發(fā)送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
直到有訂閱者訂閱才創(chuàng)建 Observable,并為每一個訂閱者創(chuàng)建一個新的 Observable,在某些情況下脆丁,要等到最后一分鐘才能獲取到最新的數(shù)據(jù)世舰,就需要這樣做
Paste_Image.png
// deferred 會等到有訂閱者,訂閱它才創(chuàng)建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,會發(fā)送從訂閱者槽卫,訂閱之后的事件
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 它開始發(fā)射原始 Observable 最近發(fā)射的數(shù)據(jù)跟压,然后繼續(xù)發(fā)送其他來自O(shè)bservable的數(shù)據(jù)
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,當(dāng)有訂閱者,訂閱了的時候他能重發(fā)事件歼培,bufferSize指定重發(fā)的次數(shù),補發(fā)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發(fā)射映射的函數(shù)對每一項做轉(zhuǎn)換
let originalSeq = sequenceOf(1, 2, 3)
originalSeq.map { $0 * 2 }.subscribe { print($0) }
/*
輸出
Next(2)
Next(4)
Next(6)
Completed
*/
flatMap
// flatMap將一個發(fā)射數(shù)據(jù)的Observable變換為多個Observables震蒋,然后將它們發(fā)射的數(shù)據(jù)合并后放進一個單獨的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連續(xù)的對序列中的元素應(yīng)用某一個元素。然后把結(jié)果作為下一次的輸入
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保留前幾項的數(shù)據(jù)
let subscription = sequenceOf(1, 2, 3, 4 , 5).take(3).subscribe { print($0) }
/*
Next(1)
Next(2)
Next(3)
Completed
*/
Combining(組合操作)
startWith
// startWith在數(shù)據(jù)序列前出入指定數(shù)據(jù)
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躲庄,當(dāng)兩個Observables中任意一個發(fā)送了數(shù)據(jù)查剖,使用一個函數(shù)把兩個Observable中最近的數(shù)據(jù)進行結(jié)合
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中的數(shù)據(jù)一一對應(yīng)結(jié)合時,再發(fā)送數(shù)據(jù)
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的發(fā)射物
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>>轉(zhuǎn)為為這樣的Observable,它逐個發(fā)射數(shù)據(jù)的Observable
let var1 = Variable(0)
let var3 = Variable(var1)
let d = var3.switchLatest().subscribe { print($0) }