RxSwift
[RxSwift] Transforming Operators
thoonk:
2022. 1. 2. 20:01
반응형
Transforming Operators 에 관해 정리한 내용을 기록합니다.
Transforming Operators
toArray
Observable을 다른 객체 또는 자료 구조로 변환한다.
Observable.of(1,2,3,4)
.toArray()
.subscribe(onSuccess: {
print($0)
})
.disposed(by: bag)
// [1,2,3,4]
map
Observable에서 방출된 각각의 요소를 원하는 함수를 적용하여 변환한다.
기존 map과 동일하게 작동하고 Observable에서 동작한다는 점이 다르다.
Observable.range(start: 1, count: 3)
.map { $0 * $0 }
.subscribe(onNext: {
print($0, terminator: " ")
})
.disposed(by: bag)
// 1 4 9
enumerated
방출된 요소의 index를 확인하고 싶을 때 사용한다.
Observable.of(1,2,3,4,5)
.enumerated()
.map { index, value in
if index > 2 {
return 2 * value
} else {
return value
}
}
.subscribe(onNext: {
print($0, terminator: " ")
})
.disposed(by: bag)
// 1 2 3 8 10
flatMap
Observable에서 방출된 각각의 요소를 Observable로 변환하고 이들을 결합하여 하나의 새로운 Observable로 만들어 방출한다.
let sequenceInt = Observable.range(start: 1, count: 3)
let sequenceAlpha = Observable.of("A", "B", "C")
sequenceInt
.flatMap { (n: Int) -> Observable<String> in
return sequenceAlpha.map { "\(n): \($0)"}
}
.subscribe(onNext: {
print($0)
})
.disposed(by: bag)
/*
1: A
1: B
2: A
1: C
2: B
3: A
2: C
3: B
3: C
*/
sequenceInt와 sequnceAlpha 두 개의 Observable을 하나의 시퀀스로 평평(flat)하게 방출된다.
flatMapFirst
flatMap과 유사하게 동작하지만 먼저 생성된 시퀀스의 동작이 다 끝날 때까지 새로 방출되는 요소들은 무시된다.
sequenceInt
.flatMapFirst{ (n: Int) -> Observable<String> in
return sequenceAlpha.map { "\(n): \($0)" }
}
.subscribe(onNext: {
print($0)
})
.disposed(by: bag)
/*
1: A
1: B
1: C
*/
‘1’에 대한 첫번째 스트림일 때 위 출력 결과와 같이 다른 스트림은 무시되는 것을 확인할 수 있다.
flatMapLatest
새로운 시퀀스를 생성하여 동작하는 중에 새로운 요소가 방출되게 된다면 이전 시퀀스를 dispose하고 새롭게 들어오는 요소에 대한 시퀀스를 생성하여 동작한다.
가장 최신의 값이 필요할 때 주로 사용한다. (e.g. Networking, Searching)
sequenceInt
.flatMapLatest { (n: Int) -> Observable<String> in
return sequenceAlpha.map { "\(n): \($0)" }
}
.subscribe(onNext: {
print($0)
})
.disposed(by: bag)
/*
1: A
2: A
3: A
3: B
3: C
*/
기존의 시퀀스를 dispose하고 새로운 요소에 대한 시퀀스를 생성하여 방출하는 것을 확인할 수 있다.
부족한 점 피드백해주시면 감사합니다👍
반응형