본문 바로가기
iOS/RxSwift

[RxSwift] Observable 항목 변환 메서드 정리

by 6cess 2024. 12. 11.

0. 공식 문서 먼저 정독

 

ReactiveX - Observable

Observable ReactiveX에서 옵저버는 Observable을 구독한다. Obseravable이 배출하는 하나 또는 연속된 항목에 옵저버는 반응한다. 이러한 패턴은 동시성 연산을 가능하게 한다. 그 이유는 Observable이 객체를

reactivex.io

 

1. map

각 아이템을 파라미터로 받아 다른 값으로 변환

let observable = Observable.of(1, 2, 3)
observable
    .map { $0 * 2 }
    .subscribe(onNext: { print($0) })

// 출력: 2, 4, 6


2. flatmap

각 아이템을 새 Observable 로 변환하여 모든 항목을 하나의 스트림을 병합
보통 각 아이템별로 비동기 작업을 호출할 때 사용

let observable = Observable.of(1, 2, 3)

observable
    .flatMap { number in
        Observable.just(number * 2) // 각 숫자를 새로운 Observable로 변환
    }
    .subscribe(onNext: { print($0) })

// 출력: 2, 4, 6

 

3. concatMap

 

flatMap과 유사하지만 각 Observable은 완료될 때까지 기다렸다가 다음 항목을 처리하여 순서가 보장

let observable = Observable.of(1, 2, 3)

observable
    .concatMap { number in
        Observable<Int>.create { observer in
            // 각 숫자마다 딜레이를 시뮬레이션
            DispatchQueue.global().asyncAfter(deadline: .now() + Double(number)) {
                observer.onNext(number)
                observer.onCompleted()
            }
            return Disposables.create()
        }
    }
    .subscribe(onNext: { print($0) })

// 출력:
// 1 (1초 후)
// 2 (3초 후 = 1초 + 2초)
// 3 (6초 후 = 3초 + 3초)

 

4. scan

 

초기값과 함께 각 아이템을 누적하여 연산, 새로운 값을 생성

누적된 값, 현재 아이템의 값을 전달하는 파라미터 두개가 있음

let observable = Observable.of(1, 2, 3)
observable
    .scan(0) { acc, current in
        acc + current
    }
    .subscribe(onNext: { print($0) })

// 출력: 1, 3, 6


5. reduce

모든 항목을 처리한 후 최종 누적 결과를 방출

let observable = Observable.of(1, 2, 3, 4, 5)

observable
    .reduce(0) { (accumulator, current) in
        accumulator + current
    }
    .subscribe(onNext: { print($0) })

// 출력: 15


6. buffer

지정된 시간 간격으로 각 아이템들을 배열로 방출

let observable = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
observable
    .buffer(timeSpan: .seconds(3), count: 3, scheduler: MainScheduler.instance)
    .subscribe(onNext: { print($0) })

// 출력: [0, 1, 2], [3, 4, 5] ...


7. window

buffer와 비슷하지만 배열이 아니라 Observable을 방출

let observable = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
observable
    .window(timeSpan: .seconds(3), count: 3, scheduler: MainScheduler.instance)
    .flatMap { $0 }
    .subscribe(onNext: { print($0) })

// 출력: 0, 1, 2, 3, 4, 5 ...

8. startWith

데이터 스트림의 시작에 특정 항목을 추가

let observable = Observable.of(2, 3, 4)
observable
    .startWith(1)
    .subscribe(onNext: { print($0) })

// 출력: 1, 2, 3, 4


9. distinctuntilChanged

직전 데이터과 현재 데이터가 동일하다면 중복된 값을 제거하고 변경된 값만 방출

let observable = Observable.of(1, 1, 2, 2, 3, 3)
observable
    .distinctUntilChanged()
    .subscribe(onNext: { print($0) })

// 출력: 1, 2, 3