ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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. Observableclass 메소드를 사용하여 시퀀스를 생성한다.

    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은 독일 - 스페인 순서대로 출력이 되었다.



Designed by Tistory.