ย Transforming Operator
Transforming Operator๋ Observable์ด ๋ด๋ณด๋ด๋ ์ด๋ฒคํธ ํ์
์ ๋ณํํ๋ ์ฐ์ฐ์์
๋๋ค.
toArray
Observable์ด ๋ฐฉ์ถํ๋ ๋ชจ๋ ์์๋ฅผ ๋ฐฐ์ด์ ๋ด์ ๋ฐฉ์ถ
toArray๋ completed ์ด๋ฒคํธ ์ ๊น์ง ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๊ธฐ ์๋ค๊ฐ completed ์์ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํฉ๋๋ค.
์๋๋ Observable๋ฅผ ๋ฆฌํดํ๋๋ฐ, RxSwift 5.0๋ถํฐ Single ํ์
์ ๋ฆฌํดํฉ๋๋ค.
let disposeBag = DisposeBag()
let subject = PublishSubject<Int>()
subject
.toArray()
.subscribe(onSuccess: {
print($0)
})
.disposed(by: disposeBag)
subject.onNext(1)
subject.onNext(2)
subject.onCompleted()
/*
[1, 2]
*/
Swift
๋ณต์ฌ
map
Swift์ ๊ณ ์ฐจํจ์ map๊ณผ ๋์ผํ๊ฒ ๊ฐ๊ฐ์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ ํ ๋ ์ฌ์ฉ
map์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ ๋ฌ๋ฐ์ ์์์ ํ์
๊ณผ ๋ฆฌํดํ๋ ์์์ ํ์
์ด ๊ฐ์ง ์์๋ ๋ฉ๋๋ค.
let disposeBag = DisposeBag()
let formatter = NumberFormatter()
formatter.numberStyle = .spellOut
Observable<NSNumber>.of(123, 4, 56)
.map { formatter.string(from: $0) ?? "" }
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
/*
๋ฐฑ์ด์ญ์ผ
์ฌ
์ค์ญ์ก
*/
Swift
๋ณต์ฌ
flatMap
Observable์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ ์๋ก์ด Observable๋ก ๋ณํํด์ ๋ฐฉ์ถ
์๋ก์ด Observable์ ์๋ก์ด ํ์๋ผ์ธ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ๊ฐ Observable Sequence๋ค์ ํ๋์ Observable Sequence๋ก ๋ณํฉ๋ฉ๋๋ค.
struct Student {
var score: BehaviorSubject<Int>
}
let disposeBag = DisposeBag()
let ryan = Student(score: BehaviorSubject(value: 80))
let charlotte = Student(score: BehaviorSubject(value: 90))
let student = PublishSubject<Student>()
student
.flatMap { $0.score }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
student.onNext(ryan)
ryan.score.onNext(85)
student.onNext(charlotte)
ryan.score.onNext(95)
charlotte.score.onNext(100)
/*
80
85
90
95
100
*/
Swift
๋ณต์ฌ
flatMapLatest
๊ฐ์ฅ ์ต๊ทผ์ ๋์ด์จ Observable ์ด๋ฒคํธ ๊ฐ๋ง ๋๊น
map๊ณผ switchLatest๋ฅผ ํฉํ ํํ๋ก ํญ๋ชฉ์ ํ๋์ Observable๋ก ํฉ์น์ง ์์ต๋๋ค. ๊ฐ์ฅ ์ต๊ทผ์ ๋ค์ด์จ Observable๋ก ๋์ด๊ฐ๋ฉด์ ์๋์ ์ผ๋ก ์ด์ Observable ๊ตฌ๋
์ ํด์งํฉ๋๋ค.
let disposeBag = DisposeBag()
let a = BehaviorSubject(value: 1)
let b = BehaviorSubject(value: 2)
let subject = PublishSubject<BehaviorSubject<Int>>()
subject
.flatMapLatest { $0.asObservable() }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject.onNext(a)
subject.onNext(b)
a.onNext(11)
b.onNext(22)
b.onNext(222)
a.onNext(111)
/*
1
2
22
222
*/
Swift
๋ณต์ฌ
flatMapFirst
์ฒ์ ๊ตฌ๋
์ ์์ํ Observable์ ์ด๋ฒคํธ๋ง ๋๊น
flatMapLatest์ ๋ค๋ฅด๊ฒ ์ฒ์ ๊ตฌ๋
์ ์์ํ Observable์ ์ด๋ฒคํธ๋ง ๋๊น๋๋ค.
let disposeBag = DisposeBag()
let a = BehaviorSubject(value: 1)
let b = BehaviorSubject(value: 2)
let subject = PublishSubject<BehaviorSubject<Int>>()
subject
.flatMapFirst { $0.asObservable() }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject.onNext(a)
subject.onNext(b)
a.onNext(11)
b.onNext(22)
b.onNext(222)
a.onNext(111)
/*
1
11
111
*/
Swift
๋ณต์ฌ
groupBy
์ด๋ฒคํธ๋ฅผ ๋ถ๋ฅํด์ ๋ค๋ฅธ Observable๋ก ๋ณํ
groupBy๋ฅผ ์ฌ์ฉํ๋ฉด ์กฐ๊ฑด์ ํด๋นํ๋ ์์๋ค์ ์์ฝ๊ฒ Grouping ๊ฐ๋ฅํฉ๋๋ค.
let disposeBag = DisposeBag()
let words = ["Apple", "Banana", "Orange", "Book", "City", "Axe"]
Observable.from(words)
.groupBy { $0.count }
.flatMap { $0.toArray() }
.subscribe { print($0) }
.disposed(by: disposeBag)
/*
next(["Banana", "Orange"])
next(["Axe"])
next(["Book", "City"])
next(["Apple"])
completed
*/
Swift
๋ณต์ฌ