๊ณฐํ๊น ๋์ RxSwift 4์๊ฐ์ ๋๋ด๊ธฐ (์ข ํฉํธ) ์์์ ๋ณด๊ณ ์์ฑํ ๊ธ์ ๋๋ค ^~^
์ ๋ง ์์ด๋ณด,, ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ ์ ์ฅ์์ ๊ฐ์ ์์์ ๋ณด๊ณ ์์์ ํ๋ฆ๋๋ก ์์ฑํ ๊ธ์ด๋ ๋นํ์ ๋์ผ๋ก ๊ธ์ ์ฝ์ด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค~~ ์ค๋ฅ ์ง์ ๋ํ์!
Subject
- Observable ๋ฐ์์ ๊ฐ์ ๋ฐ์ ์์ ์ปจํธ๋กคํ ์ ์์
- ์ข
๋ฅ 4๊ฐ(docs ์ฐธ๊ณ )
- AsyncSubject
- Subcribe๊ฐ ์๋ฌด๋ฆฌ ๋ง์ด ๋ค์ด์๋ Complete ์์ ์ ๊ฐ์ฅ ๋ง์ง๋ง ๋ฐ์ดํฐ๋ง ๋ชจ๋์๊ฒ ๋ด๋ ค ์ค
- BehaviorSubject
- ๊ธฐ๋ณธ๊ฐ ํ๋ ๊ฐ์ง๊ณ ์์, ๋๊ตฐ๊ฐ๊ฐ Subscribeํ๋ฉด ๊ธฐ๋ณธ๊ฐ์ ๋ด๋ ค ์ค
- ์ค๊ฐ์ ์๋กญ๊ฒ Subscirbe๊ฐ ๋ค์ด์ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐ์ฅ ์ต๊ทผ์ ๊ฐ์ ๋ด๋ ค ์ค
- PublishSubject
- Subscribe๊ฐ ๋ค์ด์ค๋ฉด ๊ทธ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ค ์ค
- ์ค๊ฐ์ ์๋กญ๊ฒ Subscribe๊ฐ ๋ค์ด์๋ ๊ทธ ์ค๊ฐ๋ถํฐ ๊ทธ๋๋ก ๋ด๋ ค ์ค
- ReplaySubject
- ์ฒ์๋ถํฐ Subscribeํ๋ฉด PublishSubject์ ๋๊ฐ์ด ๋ฐ์ดํฐ ๋ด๋ ค ์ค
- ์ค๊ฐ์ Subscribe๊ฐ ๋ค์ด์ค๋ฉด ๊ทธ๋์์ ๋ฐ์ดํฐ๋ค์ ํ๋ฒ์ Replayํ์ฌ ๋ด๋ ค ์ค
Sugar API
.scan

- ๊ณ์ฐ๋ ๊ฐ์ ๊ณ์ ๋์ ์ํด
[Scan]
โ Observable์ด ๋ฐฐ์ถํ ํญ๋ชฉ์ ์ฐ์์ ์ผ๋ก ํจ์๋ฅผ ์ ์ฉํ๊ณ ์คํํ ํ ์ฑ๊ณต์ ์ผ๋ก ์คํ๋ ํจ์์ ๋ฆฌํด ๊ฐ์ ๋ฐํํ๋ค์ด๊ธฐ๊ฐ
-1๋ฒ
์ฐ์ฐํ์ฌ ๋ฆฌํด(A
),A
-2๋ฒ
์ฐ์ฐํ์ฌ ๋ฆฌํด(B
),B
-3๋ฒ
์ฐ์ฐํ์ฌ ๋ฆฌํด(C
),C
-4๋ฒ
์ฐ์ฐํ์ฌ ๋ฆฌํด(D
) ...- ์ด๊ธฐ๊ฐ๊ณผ ์ฐ์ฐ
.scan
์ ๋ค์ด์ฌ ์ฒซ ๋ฒ์งธ ๊ฐ์ ์ด๊ธฐ๊ฐ๊ณผ ์ฐ์ฐ๋จ!
Observable.of(1, 2, 3) // ๋ง์ฝ 1, 2, 3์ด ์ฐ์์ผ๋ก ๋ค์ด์จ๋ค๋ฉด
.scan(0) { (prevValue, newValue) in // ์ด๊ธฐ๊ฐ์ 0์ผ๋ก!
return prevValue + newValue
}
.subscribe(onNext: { print($0) })
// ๊ฒฐ๊ณผ
1 // (์ด๊ธฐ๊ฐ 0 + 1)
3 // (๊ธฐ์กด๊ฐ 1 + 2)
6 // (๊ธฐ์กด๊ฐ 3 + 3)
RxCocoa
- Rx๋ฅผ ํ์ฉํ UIKit์ Extension ์ ๊ณต
- Sugar API
.bind
์ํ ์ฐธ์กฐ ์์ด ์ฌ์ฉ ๊ฐ๋ฅ( .subscribe์ ๋์ผ)- .bind (2:25:25~)
- UIKit์์.rx.~ ํ์ ๋ ๋์ค๋ ๊ฐ์ด
Binder
๋ฉด ๋ฐ์ธ๋๋ฅผ ์ํฌ ์ ์์ - Subscirbe๋ฅผ ํ์ง ์๊ณ bindํด์ ์ฌ์ฉ
-
.map { "\($0)" } .bind(to: itemCountLabel.rx.text) .disposed(by: disposeBag)
-
.subscribe(onNext: [weak self] { self.itemCountLabel.text = $0 }) .disposed(by: disposeBag)
- ์์ ๋ ์ฝ๋๊ฐ ๊ฐ์ ๋์!
- ์ฅ์ :
[weak self]
๊ฐ์ ์ํ ์ฐธ์กฐ ๋ฐฉ์ง๋ฅผ ์ ํด๋ ๋จ - ์ ์ฝ๋์ฒ๋ผ UI๋ฅผ ๋ฐ๊พธ๋ ์์ ์ ์งํํ๋ ค๋ฉด ๋ฉ์ธ ์ค์ผ์ค๋ฌ์์ ๋์์์ผ์ผ ํจ!
-
.map { "\($0)" } .observeOn(MainScheduler.instance) .bind(to: itemCountLabel.rx.text) .disposed(by: disposeBag)