[RxSwift] Transforming Operator
2020. 4. 18. 20:58ㆍiOS/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 |