RxSwift의 Tranforming 연산자에 대한 정리 🚌 🚌 🚌
연산자 목차
- toArray
- map
- flatMap
- flatMapLatest
- buffer
toArray
element들을 배열로 묶어주는 연산자입니다.
1,2,3,4,5,6 -> [1,2,3,4,5,6] 으로 변형해줍니다.
여기서 toArray는 Single타입을 반환해줍니다. Single은 오직 하나의 Element만 가지는 Observable입니다. 그렇기에 Single은 success, error 두가지 event를 처리해야 합니다. 나중에 다시 다루도록 하겠습니다.
Observable.of(1,2,3,4,5)
.toArray()
.subscribe(onSuccess: {
print($0)
}).disposed(by: disposeBag)
출력
// [1,2,3,4,5]
map
element들을 단순히 변형해주는 연산자입니다. 여기서 "변형"이 되는 방법은 두가지가 될 수 있습니다.
타입을 변형(○ → □)할 수도 있고 값을 변형(○ → ○ + 2) 해서 다음 스트림으로 넘겨줄수 있습니다.
ex) ○ → □
var result: String = ""
Observable.of(1,2,3,4)
.map { String($0) }
.subscribe(onNext: {
result.append($0)
print(result)
}).disposed(by: disposeBag)
출력
// 1
// 12
// 123
// 1234
ex) ○ → ○ * 2
Observable.of(1,2,3,4)
.map { $0 * 2 }
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
출력
// 2
// 4
// 6
// 8
flatmap
mapr과 비슷하게 동작할 것 같지만 조금 다르게 동작합니다.
방출되는 아이템에 대해 각자의 Sequence를 만들고 그것을 합쳐서 하나의 Sequence로 만들어줍니다.
아래 그림은 flatmap에 대한 마블 다이어그램입니다. 하지만 더 헷갈리기만해서 인터넷에 찾아보니 이해하기 쉬운 그림이 나옵니다.
아래 그림을 보면 상단 Sequence(Observable)에서 방출한 아이템에 대해 Sequence를 각각 생성한 후, 다음 하나의 Sequence로 합쳐줍니다.
struct Student {
var score: BehaviorRelay<Int>
}
let student = PublishSubject<Student>()
student.asObservable()
.flatMap { $0.score.asObservable() }
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
let john = Student(score: BehaviorRelay(value: 75))
let mary = Student(score: BehaviorRelay(value: 96))
student.onNext(john)
john.score.accept(100)
student.onNext(mary)
mary.score.accept(80)
출력
// 75
// 100
// 96
// 80
flatmapLatest
flatmap은 observable의 모든 element의 변화를 계속 관찰하고 있습니다. flatMapLatest는 예상한대로 가장 마지막 element의 변화만 관찰합니다.
// ...
let john = Student(score: BehaviorRelay(value: 75))
let mary = Student(score: BehaviorRelay(value: 96))
student.onNext(john)
john.score.accept(100)
student.onNext(mary)
john.score.accept(20)
출력
// 75
// 100
// 96
20은 mary Observable을 관찰하고 있기 떄문에 무시
Buffer
element 한걔씩 전달하는 것이 아니라 묶음으로 전달해주는 연산자입니다.
마블 다이어그램을 보면 바로 이해할 수 있듯이 3으로 buffer size를 지정하면 3개의 elements를 묶어서 보내줍니다.
Observable.of(1,2,3,4,5,6,7,8,9)
.buffer(timeSpan: .seconds(2), count: 4, scheduler: MainScheduler.instance)
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
출처:
- https://reactivex.io/documentation/operators
- https://www.udemy.com/course/mastering-rxswift-in-ios/learn/lecture/
'iOS > RxSwift' 카테고리의 다른 글
[Operators] Combining (0) | 2022.01.31 |
---|---|
[Operators] Filtering (0) | 2022.01.30 |
[Observables] 개념 (0) | 2021.05.14 |