share(replay:scope:)
shareReplay 会返回一个新的事件序列,它监听底层序列的事件,并且通知自己的订阅者们。
解决有多个订阅者的情况下,map会被执行多次的问题。
let seq = PublishSubject<Int>()
let a = seq.map { (i) -> Int in
print("MAP---\(i)")
return i * 2
}
// .share(replay: 1, scope: .forever)
let _ = a.subscribe(onNext: { (num) in
print("--1--\(num)")
}, onError: nil, onCompleted: nil, onDisposed: nil)
seq.onNext(1)
seq.onNext(2)
let _ = a.subscribe(onNext: { (num) in
print("--2--\(num)")
}, onError: nil, onCompleted: nil, onDisposed: nil)
seq.onNext(3)
seq.onNext(4)
let _ = a.subscribe(onNext: { (num) in
print("--3--\(num)")
}, onError: nil, onCompleted: nil, onDisposed: nil)
seq.onCompleted()
有share,执行结果:
MAP---1
--1--2
MAP---2
--1--4
--2--4
MAP---3
--1--6
--2--6
MAP---4
--1--8
--2--8
--3--8
无share,执行结果:
MAP---1
--1--2
MAP---2
--1--4
MAP---3
--1--6
MAP---3
--2--6
MAP---4
--1--8
MAP---4
--2--8
WX20181218-162537@2x.png