0. 공식 문서 먼저 정독
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
'iOS > RxSwift' 카테고리의 다른 글
[RxSwift] Observable 생성 관련 메서드들 (0) | 2024.12.03 |
---|---|
[UIKit/RxSwift] UITableView를 RxSwift로 구현하는 방법 (0) | 2024.12.02 |
[RxSwift] AsyncSubject (0) | 2024.07.26 |