-
RxSwift - startWith(_:), concat(_:), concatMap(_:)에 대해서 알아보자.Ray Wenderlich/RxSwift 2018. 7. 5. 00:38
Ch9. Combining Operators p.179 - p.183
startWith(_:)
Observable시퀀스 앞에 다른 값을 추가해주는 기능을 한다.
그림과 코드를 보면 너무나도 간단하다!!
(2, 3, 4)라는 시퀀스가 있고, 맨 앞에 1을 추가하고 싶다.이를 해결하기 위해 startWith(1)을 사용해보자.
let numbers = Observable.of(2, 3, 4)
let observable = numbers.startWith(1)
observable.subscribe(onNext: { value in
print(value)
})
사족을 다는 것보다, 이것으로 설명을 마치는게 제일 깔끔해보인다.
concat(_:)
결론부터 말하자면, startWith(_:)와 굉장히 흡사하다.
startWith는 하나의 Element가 맨 앞에 추가되었다.
concat은 여러개의 Element가 추가된다. (앞으로, 뒤로 다 가능)
그림과 코드로 살펴보자.
시퀀스(1, 2, 3), 시퀀스 (4, 5, 6) 있다.
우리는 (1, 2, 3)뒤에 (4, 5, 6)이 오도록 합치고 싶다.
let first = Observable.of(1, 2, 3)
let second = Observable.of(4, 5, 6)
// 1
Observable.concat([first, second]).subscribe(onNext: { value in print(value) })
// 2
first.concat(second).subscribe(onNext: { value in print(value) })
1. Observable의 class 메소드를 사용하여 시퀀스를 생성한다.
2. Observable의 인스턴스 메소드를 사용하여 시퀀스를 생성한다.
사용법은 이렇게 두 가지가 있다.
입맛대로 사용하면 된다!!
결과는 1, 2, 3, 4, 5, 6이 출력되겠다. 너무나 명백한 것!
concatMap(_:)
flatMap(_:)과 concat(_:)이 합쳐진 것이라고 이름에서 유추할 수 있다.
사용법과 결과물도 굉장히 비슷하다.
flatMap(_:)과 concatMap(_:)의 가장 큰 차이점은!!!
concatMap(_:)에서는 순서가 보장된다는 것.
concatMap을 보기에 앞서, concat의 동작방식은 이렇다.
// first시퀀스를 subscribe하다가 complete이벤트가 발생하면 second를 subscribe하기 시작한다.
first.concat(second).subscribe(...)
그야말로 순서가 보장되는 것이다.
코드를 통해서 알아보자.
let sequences = [
"Germany": Observable.of("Berlin", "Münich", "Frankfurt"),
"Spain": Observable.of("Madrid", "Barcelona", "Valencia")
]
let observable = Observable.of("Germany", "Spain")
observable.flatMap {
country in sequences[country] ?? .empty()
}.subscribe({ print($0.element ?? "") })
observable.concatMap({ (country) in
return sequences[country] ?? .empty()
}).subscribe({ print($0.element ?? "") })
결과는 아래와 같다.
위는 독일의 도시 2개 뒤에 스페인의 도시가 출력되었다.
순서가 엉킨것이다.
하지만, concatMap은 독일 - 스페인 순서대로 출력이 되었다.
'Ray Wenderlich > RxSwift' 카테고리의 다른 글
RxSwift - combineLatest(), zip() 에 대해서 알아보자. (1) 2018.07.13 RxSwift - merge()에 대해서 알아보자. (0) 2018.07.06 RxSwift - share(), share(replay:, scope:)에 대해서 알아보자 (2) 2018.06.24 RxSwift - materialize, dematerialize에 대해서 알아보자. (0) 2018.06.13 RxSwift - flatMapLatest에 대해서 알아보자. (0) 2018.06.12