/**
Connectable Observable 如同普通的Observable,除了當(dāng)他被訂閱的時(shí)候不會(huì)以 發(fā)送item開(kāi)始外。
在這個(gè)connectionable Observable 開(kāi)始發(fā)送item之前 調(diào)用connect() ,你可以等待內(nèi)部所有的訂閱者去訂閱 Observable
*/
func sampleWithoutConnectableOperators() {
// 生成兩個(gè)序列
let int1 = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
_ = int1
.subscribe {
print("first subscription \($0)")
}
delay(5) {
_ = int1
.subscribe {
print("second subscription \($0)")
}
}
/**
first subscription Next(0)
first subscription Next(1)
first subscription Next(2)
first subscription Next(3)
first subscription Next(4)
first subscription Next(5)------------5
second subscription Next(0)
first subscription Next(6)
second subscription Next(1)
first subscription Next(7)
second subscription Next(2)
first subscription Next(8)
second subscription Next(3)
first subscription Next(9)
second subscription Next(4)
first subscription Next(10)
second subscription Next(5)
*/
}
multicast 廣播
A.multicast(B),則 將A 發(fā)送的item 廣播給 B
func sampleWithMulticast() {
let subject1 = PublishSubject<Int64>()
_ = subject1
.subscribe {
print("Subject \($0)")
}
let int1 = Observable<Int64>.interval(1, scheduler: MainScheduler.instance)
.multicast(subject1)// 將輸出廣播給subject
_ = int1
.subscribe {
print("first subscription \($0)")
}
delay(2) {
print("connection. begin ...")
int1.connect() //------> 該方法是關(guān)鍵,無(wú)此方法不會(huì)輸出
print("connection..end ..")
}
delay(4) {
_ = int1
.subscribe {
print("second subscription \($0)")
}
}
delay(6) {
_ = int1
.subscribe {
print("third subscription \($0)")
}
}
/**
connection. begin ...
connection..end ..
Subject Next(0)
first subscription Next(0)
Subject Next(1)----------------4
first subscription Next(1)
second subscription Next(1)
Subject Next(2)
first subscription Next(2)
second subscription Next(2)
Subject Next(3) -------------------> 6s
first subscription Next(3)
second subscription Next(3)
third subscription Next(3)
Subject Next(4)
first subscription Next(4)
second subscription Next(4)
third subscription Next(4)
Subject Next(5)
first subscription Next(5)
second subscription Next(5)
third subscription Next(5)
*/
}
replay(0)
每次subscribe 后,先重播之前的值,0 不重播
// publish = multicast + publicSubject
func sampleWithReplayBuffer0() {
let int1 = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
.replay(0)
_ = int1
.subscribe {
print("first subscription \($0)")
}
delay(2) {
print("connnection....")
int1.connect()// connection 設(shè)置為10 也是等待connecton執(zhí)行完才會(huì)開(kāi)始打印輸出 沒(méi)有此方法不會(huì)執(zhí)行打印
}
delay(4) {
print("44444......")
_ = int1
.subscribe {
print("second subscription \($0)")
}
}
delay(6) {
print("66666......")
_ = int1
.subscribe {
print("third subscription \($0)")
}
}
/**
connnection....
first subscription Next(0)
44444......
first subscription Next(1)
second subscription Next(1)
first subscription Next(2)
second subscription Next(2)
66666......
first subscription Next(3)
second subscription Next(3)
third subscription Next(3)
first subscription Next(4)
second subscription Next(4)
third subscription Next(4)
*/
}
replay(2)
每次subscribe ,重播之前發(fā)送的兩個(gè)item
func sampleWithReplayBuffer2() {
print("--- sampleWithReplayBuffer2 ---\n")
let int1 = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
.replay(2)
_ = int1
.subscribe {
print("first subscription \($0)")
}
delay(2) {
int1.connect()
print("22222.....")
}
delay(6) {
print("44444....")
_ = int1
.subscribe {
print("second subscription \($0)")
}
}
delay(10) {
print("66666666666666.....")
_ = int1
.subscribe {
print("third subscription \($0)")
}
}
/**
--- sampleWithReplayBuffer2 ---
22222.....
first subscription Next(0)
first subscription Next(1)
first subscription Next(2)
44444....
second subscription Next(1)----
second subscription Next(2)---- replay buffer = 2
first subscription Next(3)
second subscription Next(3)
first subscription Next(4)
second subscription Next(4)
first subscription Next(5)
second subscription Next(5)
first subscription Next(6)
second subscription Next(6)
66666666666666.....
third subscription Next(5)----
third subscription Next(6)---- replay 的輸出
first subscription Next(7)
second subscription Next(7)
third subscription Next(7)
first subscription Next(8)
second subscription Next(8)
third subscription Next(8)
*/
}
shareReplay(n)
與replay 不同之處在于 shareReplay 不用connection就可以觸發(fā)輸出,replay 需要connection 。
另外replay的輸出是從0 到n 的過(guò)程,中間有subscribe 就獲取當(dāng)前值輸出(此時(shí)item為 10 ,就輸出10)
如果Replay 的observable 在connection之前已添加多個(gè)subscribe,則所有的序列都會(huì)從頭一起開(kāi)始
func sampleWitShareReplayBuffer3() {
let int1 = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
.shareReplay(2)// shareReplay 與replay 可以觸發(fā)subscribe
_ = int1
.subscribe {
print("first subscription \($0)")
}
delay(6) {
print("44444....")
_ = int1
.subscribe {
print("second subscription \($0)")
}
}
delay(10) {
print("66666666666666.....")
_ = int1
.subscribe {
print("third subscription \($0)")
}
}
/**
first subscription Next(0)
first subscription Next(1)
first subscription Next(2)
first subscription Next(3)
first subscription Next(4)
first subscription Next(5)
44444....
second subscription Next(4)-------buffer
second subscription Next(5)------- buffer
first subscription Next(6)
second subscription Next(6)
first subscription Next(7)
second subscription Next(7)
first subscription Next(8)
second subscription Next(8)
first subscription Next(9)
second subscription Next(9)
66666666666666.....
third subscription Next(8)-----buffer
third subscription Next(9)-----buffer
first subscription Next(10)
second subscription Next(10)
third subscription Next(10)
*/
}
shareReplay replay
無(wú)需觸發(fā)輸出 需要connenction觸發(fā)
buffer 輸出 buffer輸出
如果不需要replay ,則不需要connection
replay ,publish , multicast 需要connection 才能觸發(fā)