[RxSwift] Transforming Operator

2020. 4. 18. 20:58iOS/RxSwift

toArray

  • completed가 된 시점 까지의 데이터를 array로 바꿔서 emit한다.
Observable.of(1,2,3,4,5)
    .toArray()
    .subscribe(onSuccess: {
        print($0)
    })
// [1, 2, 3, 4, 5]

영상에는 .toArray()가 Observable인데 RxSwift 5.0부터는 Single로 바뀐 듯 하다.

그래서 .subscribe(onNext: ) 가 안됨..

map

  • swift에서 사용하는 map과 같다.
  • 다른 것이 있다면 observable하게 작동한다는 점?
Observable.of(1,2,3,4,5)
    .map {
        return $0 * 2
}.subscribe(onNext: {
    print($0)
}).disposed(by: disposeBag)
/*
2
4
6
8
10
*/

*저기서 return은 없어도 되긴함. swift 5.0부터 return value가 한 줄일 경우 따로 명시해주지않아도 된다.

flatMap

  • 각 observable sequence 들을 하나의 observable sequence로 병합시켜준다.
struct Student {
    var score: BehaviorRelay<Int>
}

let john = Student(score: BehaviorRelay(value: 75))  
let mary = Student(score: BehaviorRelay(value: 95))

let student = PublishSubject()

student.asObservable()  
.debug("debug")  
.flatMap { $0.score.asObservable() }  
.subscribe(onNext: {  
print($0)  
}).disposed(by: disposeBag)

student.onNext(john)  
john.score.accept(100)  
student.onNext(mary)  
john.score.accept(90)  
\*  
2020-04-13 20:51:34.638: debug -> subscribed  
2020-04-13 20:51:34.639: debug -> Event next(Student(score: RxRelay.BehaviorRelay<Swift.Int>))  
75  
100  
2020-04-13 20:51:34.642: debug -> Event next(Student(score: RxRelay.BehaviorRelay<Swift.Int>))  
95  
90  
*/

이해를 돕기위해 debug를 해보았다.

john을 subscribe 한 후, 100을 accept 하고 난 후

mary를 subscribe하고난 후, john에 90을 accept해줘도 값이 emit되는 것을 알 수 있다.

flatMapLatest

  • flatMap과 비슷하지만, 가장 마지막에 추가된 sequence observable만 emit한다.
student.asObservable()  
.debug("debug")  
.flatMapLatest { $0.score.asObservable() }  
.subscribe(onNext: {  
print($0)  
}).disposed(by: disposeBag)

student.onNext(john)  
john.score.accept(100)  
student.onNext(mary)  
john.score.accept(90)  
\*  
2020-04-13 20:53:35.700: debug -> subscribed  
2020-04-13 20:53:35.702: debug -> Event next(Student(score: RxRelay.BehaviorRelay<Swift.Int>))  
75  
100  
2020-04-13 20:53:35.704: debug -> Event next(Student(score: RxRelay.BehaviorRelay<Swift.Int>))  
95  
*/

mary가 구독 되고 난 후 john에 값을 accept해도 출력되지않는 것을 볼 수 있다.

'iOS > RxSwift' 카테고리의 다른 글

[RxSwift] Combining Operator  (0) 2020.04.25
[RxSwift] Filtering Operator  (0) 2020.04.07
[RxSwift] Observable & Subject  (0) 2020.04.02