RxSwift - Combining Operator
안녕하세요. 그린입니다🟢
이번 포스팅에서는 Combining Operator에 대해 학습해보겠습니다💁🏻
Combining Operator?
컴바인 즉 구성하고 조직한다는 의미로 이번에 알아볼 오퍼레이터는 옵저버블의 데이터를 병합해줍니다.
이전 제 블로그에서 중구난방하게 concat, merge 등 옵저버블 시퀀스를 병합해주는 학습을 해본적 있습니다.
이번에는 아래 링크를 통해 조금 더 체계적으로 구분하고 알아보려합니다🙌
startWith(_:)
생성되어 방출되는 옵저저블에 대해 초기값을 줄 수 있습니다.
코드로 보시죠!
let input = Observable.of(2, 3, 4)
let observable = input.startWith(1)
observable.subscribe(onNext: {
print("value is \($0)")
})
// value is 1
// value is 2
// value is 3
// value is 4
이렇게 2~4까지 생성된 옵저버블에 초기값을 1로 주어 방출 할 수 있습니다.
concat(_:)
여러 옵저버블 시퀀스를 순서대로 합쳐줍니다.
여기서 중요한것은 concat으로 담아주는 순서입니다.
이 순서에 따라 방출되는 값 순서가 달라지죠.
코드로 보겠습니다!
let firstInput = Observable.of("Green", "Red")
let secondInput = Observable.of("Blue", "White")
let observable = Observable.concat([
firstInput,
secondInput,
])
observable.subscribe(onNext: {
print("value is \($0)")
})
// value is Green
// value is Red
// value is Blue
// value is White
요 어레이에 들어가는 순서대로 담겨진다고 생각하면 됩니다.
또한 이렇게도 합쳐줄 수 있습니다.
let firstInput = Observable.of("Green", "Red")
let secondInput = Observable.of("Blue", "White")
let observable = firstInput.concat(secondInput)
observable.subscribe(onNext: {
print("value is \($0)")
})
// value is Green
// value is Red
// value is Blue
// value is White
당연히 순서대로 넣어주면 결과는 동일해요.
어떻게 사용할지는 스타일의 차이일듯 합니다🙌
concatMap(_:)
위의 설명한 concat의 기능과 flatMap이 합쳐진거라 볼 수 있어요.
우선 코드를 먼저 보고 설명을 이어갈께요!
let input = [
"First": Observable.of("Green", "Red"),
"Second": Observable.of("Blue", "White"),
]
let observable = Observable.of("First", "Second")
.concatMap({ order in
input[order] ?? .empty()
})
observable.subscribe(onNext: {
print("value is \($0)")
})
// value is Green
// value is Red
// value is Blue
// value is White
우선 2차원 배열로 만들어준 input과 키 값만 지정된 옵저저블을 만들어 주었습니다.
그 뒤 해당 옵저버블에 concatMap을 하게 되면 순서대로 키 값을 비교해 맞는 옵저버블을 넣어주게 됩니다.
그러면 저렇게 순서대로 들어올수가 있습니다!
merge()
merge는 concat과 다 동일합니다.
다만 하나! 순서가 없습니다. 그냥 흐름상에 맞게 합쳐줍니다.
concat처럼 어레이에 순서대로 담아주어도 해당 옵저버블 이벤트가 발생한 순서대로 섞여서 합쳐지게 됩니다.
이건 concat을 이해하면 충분히 이해가 되는 부분이니 코드 설명은 생략하겠습니다!
merge(maxConcurrent:)
위에서 설명한 merge는 합칠 수 있는 시퀀스가 무한대입니다.
다만 네트워크 처리에 대해 많은 요청을 수없이 합친다면 무리가 갈 수 있겠죠?
그렇기에 최대 합칠 수 있는 카운트를 줄 수 있습니다.
저 파라미터 인자값으로는 양의 정수값을 주면 됩니다🐏
그 다음으로 알아볼것이
combineLatest와 withLatestFrom 그리고 zip에 대해 알아보는것이 맞는데 이것은 제가 예전에 포스팅에서 따로 다뤄본적이 있어서
그 링크로 대체하겠습니다.
궁금하신분은 아래 포스트를 보고 오시길 추천드립니다! (상세히 학습해봤어요🙋🏻)
[combineLatest & withLatestFrom]
https://green1229.tistory.com/164
[zip]
https://green1229.tistory.com/search/zip
자 그럼 이어서 또 없는 부분인 스위칭 오퍼레이터에 대해 알아보죠!
amb(_:)
이름에서부터 알 수 있듯이 ambiguous 즉 모호하다는 명칭과 잘 어울리는 오퍼레이터입니다.
모호한 상황에서 어떤 옵저버블 시퀀스를 따를지 정해줍니다.
코드로 보시죠!
let firstInput = PublishSubject<String>()
let secondInput = PublishSubject<String>()
let observable = firstInput.amb(secondInput)
observable.subscribe(onNext: {
print("value is \($0)")
})
firstInput.onNext("Green")
secondInput.onNext("Blue")
firstInput.onNext("Red")
secondInput.onNext("White")
// value is Green
// value is Red
이렇게 사용될 수 있습니다.
두개의 방출을 기다리다 먼저온쪽의 방출을 이어가고 다른 옵저버블의 구독은 중단됩니다.
다음으론 시퀀스 내 요소들을 결합해주는 오퍼레이터에 대해 알아보겠습니다🙋🏻
reduce
네 맞아요. 우리가 자~알~ 알고 있는 그 reduce랑 동일합니다.
초기값부터 방출되는 모든 값을 합쳐서 반환해줍니다.
코드로 간단히 보시죠!
let input = Observable.of(1, 2, 3, 4)
let observable = input.reduce(10, accumulator: { sum, value in
return sum + value
})
observable2.subscribe(
onNext: {
print("Sum is \($0)")
}
)
// Sum is 20
이건 뭐 설명안해도 쉽겠죠!?
결국 한 값만 방출되게 됩니다.
마무리
이번 포스팅에서는 간단하게 Combining Operator에 대해 알아봤습니다.
중간중간 같은 맥락임에도 소개하지 않은 오퍼레이터가 있습니다.
저도 아직 완벽히 이해가 되지 않았기에 좀 더 학습하고 디테일하게 따로 포스팅을 하겠습니다🙏🏻
학습할수록 정말 오퍼레이터가 무궁무진하단걸 또한번 느낍니다🤭