amb
amb는 두개이상의 소스옵저버블중에서 가장먼저 NE를 전달한 옵저버블을 구독하고 나머지는 무시한다.
마블다이어그램에서 가장먼저 NE를 전달하는것은 두번째 옵저버블이다 이 옵저버블이 전달하는 NE가 구독자에게 전달되고 나머지는 무시된다.
amb연산자를 사용하면 여러 서버로 요청을 전달하고 가장 빠른 응답을 처리하는 패턴을 구현할 수 있다.
public func amb<O2: ObservableType>
(_ right: O2)
-> Observable<Element> where O2.Element == Element {
Amb(left: self.asObservable(), right: right.asObservable())
}
하나의 옵저버블을 파라미터로 받는다.
두 옵저버블중 가장먼저 NE를 전달하는 옵저버블을 구독하고 이옵저버블의 이벤트를 구독자에게 전달하는 새로운 옵저버블을 리턴한다.
만약 3개이상의 옵저버블을 대상으로 연산자를 사용해야 한다면 타입메서드로 구현되어있는 연산자를 사용한다.
public static func amb<Sequence: Swift.Sequence>(_ sequence: Sequence) -> Observable<Element>
where Sequence.Element == Observable<Element> {
sequence.reduce(Observable<Sequence.Element.Element>.never()) { a, o in
a.amb(o.asObservable())
}
}
이때는 모든 소스 옵저버블을 배열 형태로 전달한다.
a.amb(b)
.subscribe{ print($0) }
.disposed(by: bag)
a.onNext("A")
b.onNext("B")
//next(A)
a가 먼저 NE를 방출했기 때문에 a를 구독하고 a가 내보내는 모든 이벤트가 구독자에게 전달된다.
배열형태 사용방법
Observable.amb([a, b, c])
.subscribe{ print($0) }
.disposed(by: bag)
a.onNext("A")
b.onNext("B")
//next(A)