Reactive eXtension ์ด๋?๐
* An API for asynchronous programming with observable streams.
* ReactiveX is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming
* In computing, reactive programming is a declarative programming paradigm concerned with data streams and the propagation of change.
- ๊ด์ฐฐ ๊ฐ๋ฅํ ํ๋ฆ์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ๋ฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์ปดํจํ ์์ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ฐ์ดํฐ ์คํธ๋ฆผ๋ค๊ณผ ๋ณํ์ ํผ์ง๊ณผ ๊ด๊ณ๋์ด ์๋ ์ ์ธ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
์ฅ์ ?๐
- ์ผ๊ด์ฑ ์๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ฝ๋
- ๊ฐ๋ ์ฑ์ด ์ข์ ๊น๋ํ ์ฝ๋
- ์ฌ์ด ๋ฉํฐ ์ค๋ ๋ ์ฒ๋ฆฌ
๐ฐ RxSwift ๋?
- ReactiveX๋ฅผ ๋์ ํ Swift ์ ์ฉ ๊ตฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
https://github.com/ReactiveX/RxSwift
* RxSwift : ReactiveX์์ ์ ์ํ Rx ํ์ค์ ์ ๊ณตํจ. ์ข ์์ฑ์ ์์.
* RxCocoa : ๊ณต์ ์ํ์ค, ํน์ฑ ๋ฑ๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ iOS / macOS / watchOS ๋ฐ tvOS ์ฑ ๊ฐ๋ฐ์ ์ํ Cocoa ๊ด๋ จ ๊ธฐ๋ฅ์ ์ ๊ณตํจ. RxSwift์ RxRelay์ ์ข ์๋จ.
* RxRelay : Subjects๋ฅผ ๋ฉํํ๋ PublishRelay, BehaviorRelay, ReplayRelay๋ฅผ ์ ๊ณตํจ. RxSwift์ ์ข ์๋จ.
* RxTest & RxBlocking : Rx ๊ธฐ๋ฐ ์์คํ ์ ๋ํ ํ ์คํธ ๊ธฐ๋ฅ์ ์ ๊ณตํจ. RxSwift์ ์ข ์๋จ.
๐ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ด๋?
: ์ฌ๋ฌ ์์ ์ ์์ฐจ์ ์ผ๋ก ์ํํ๋ ๊ฒ์ด ์๋๋ผ ๋์์ ์ํํ ์ ์์ด, ๋จผ์ ์์ฒญํ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ํ ์ ์๋๋ก ํจ.
๐ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ(Impreative programming)
- ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฌ์ฑํด ๋๊ฐ๋ ๊ณผ์ ์ ๊ด์ฌ์ ๋ .
- ํ๋ก๊ทธ๋๋ฐ์ ์ํ์ ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค๋ ๊ตฌ๋ฌธ์ ๊ด์ ์์ ์ฐ์ฐ์ ์ค๋ช ํ๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
- ์ปดํจํฐ๊ฐ ์ํํ ๋ช ๋ น๋ค์ ์์๋๋ก ํ๋ก๊ทธ๋๋ฐํ๋ ๊ฒ
- ์คํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ช ์ํจ.
๐ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ(Declarative programming)
- ์ปดํจํฐ๊ฐ ๋ฌด์์ ํด์ผํ ์ง๋ฅผ ํ๋ก๊ทธ๋๋ฐ
- ๋ชฉํ๋ฅผ ๋ช ์ํ๊ณ ์๊ณ ๋ฆฌ์ฆ์ ๋ช ์ํ์ง ์์.
Ex) ์นํ์ด์ง๋ ์ ์ธํ์. ํ์ด์ง๊ฐ ์ ๋ชฉ, ๊ธ๊ผด, ๋ณธ๋ฌธ๊ณผ ๊ฐ์ด '๋ฌด์'์ ๋ํ๋ด์ผ ํ๋์ง ๋ฌ์ฌํ๋ ๊ฒ์ด์ง '์ด๋ค ๋ฐฉ๋ฒ'์ผ๋ก ํ๋ฉด์ ๋ํ๋ด์ผ ํ๋์ง๋ฅผ ๋ฌ์ฌํ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ.
๐ฆ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ(Functional programming)
- ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ ํ์ ๊ฐ๋
- ์๋ฃ ์ฒ๋ฆฌ๋ฅผ ์ํ์ ํจ์์ ๊ณ์ฐ์ผ๋ก ์ทจ๊ธํ๊ณ ์ํ์ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ฆฌํ๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
- ์์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์๋ let x = 1์ด๋ผ๊ณ ์ง์ ํ์ 2๋ฅผ ํ ๋นํ ์ ์์. => 2๋ฅผ ํ ๋นํ ์๋ก์ด ๋ณ์๋ฅผ ๋ง๋๋ ๋ฐฉ์
์ผ๊ธ ๊ฐ์ฒด(First-citizen class)
> ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํ ์ฐ์ฐ์ ๋ชจ๋ ์ง์ํ๋ ๊ฐ์ฒด
- Swift์์๋ ํจ์๋ฅผ ์ผ๊ธ ๊ฐ์ฒด๋ก ์ทจ๊ธํจ.
- ์ธ์๊ฐ๊ณผ ๋ฐํ๊ฐ์ผ๋ก ํจ์๋ฅผ ์ ๋ฌํ ์ ์์.
- ๋ณ์์ ๋์ ์ด ๊ฐ๋ฅํ๊ณ , ๋น๊ต๋ ๊ฐ๋ฅํจ.
- ๋ณ์๋ ๊ตฌ์กฐ์ฒด ์์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ ์์.
์์ ํจ์(Pure function)
> ์ธ๋ถ ์ํ์ ์์กด์ ์ด์ง ์์ผ๋ฉฐ ๋ถ์์ฉ(side-effect)์ด ์๋ ํจ์. ํจ์์ ์คํ์ด ์ธ๋ถ์ ์ํฅ์ ๋ผ์น์ง ์๋ ํจ์
- ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๊ฒ ์ธ์ ์ฐ์ฐ์ ์คํํ์ง ์์.
- ์ ๋ ฅ์ด ๋์ผํ๋ฉด ์ถ๋ ฅ์ด ๋์ผํด์ผ ํจ.
- ์ํ ๋ณํ๊ฐ ์์ด์ผ ํจ.
# ํ ์คํธ๊ฐ ์ฝ๊ณ , ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง.
# ์์ธก ๊ฐ๋ฅ์ฑ์ด ๋์์ง.
// ์์ํจ์ ์์
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
add(1, 2) // 3
๐คฉ RxSwift์ ํ์์ฑ
- ๋ช ์์ ์ผ๋ก ๊ณต์ ๋ mutable state๋ฅผ ์๊ธฐ ์ํจ
- Imperative Programming(๋ช
์์ ์ฝ๋)์ ํ๊ณ ๊ทน๋ณต
- ๋ช ์์ ์ฝ๋๋ฅผ ํตํด ๋น๋๊ธฐ ์์ ์ ํ ๋, ๋ฉ์๋ ์์์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์๋ ๋ฑ ์ด๋ ค์ด ์ ๊ทน๋ณต ๊ฐ๋ฅํจ.
- Side Effects๋ฅผ ํตํด ์ํ ํ์
- ์ฌ์ด๋ ์ดํํธ๊ฐ ๋ฐ์ํ๋ค๋ฉด, ๊ทธ ๋ฉ์๋๊ฐ ์คํ๋๊ธฐ ์ ์ ์์ ์ ์ง์ ์ง์ ํด์ค ์ ์๋ ์ฅ์ ์ด ์์.
- Declarative code(์ ์ธ์ ์ฝ๋)
- ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋, ๊ทธ ๋ฐ์ดํฐ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํจ.
- Reactive System
- Responsive : ์ธ์ ๋ UI๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ ์ ์์.
- Resilient(ํ๋ ฅ์ด ์๋) : ๊ฐ behavior๋ค์ ๋ ๋ฆฝ์ ์ด๊ณ , ์๋ฌ๊ฐ ๋ฐ์ํ๊ณ ํ๋ณตํ ๋ ์ ์ฐํจ.
- Elastic(์ ์ฐํจ) : ๋ค์ํ workload๋ฅผ ์ฒ๋ฆฌ(๋ฐ์ดํฐ ๋ชจ์, ์์ ๊ณต์ ๋ฑ)
- Message driven : components๋ค์ ๋ฉ์์ง ๊ธฐ๋ฐ์ผ๋ก ์ํธ์์ฉํ๋ฏ๋ก ์ฌ์ฌ์ฉ์ฑ์ ์ฅ์ ์ด ์๊ณ , lifecycle๊ณผ ํด๋์ค์ ๊ตฌํ์ ๋ถ๋ฆฌํ ์ ์์.
์ฃผ์ ๊ตฌ์ฑ ์์
Observable
> Observable = observable sequence = sequence
- ๊ด์ฐฐ์์ธ Observer๊ฐ ์๊ณ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๋ Observable์ด ์์.
- Observer๊ฐ Observable์ ๊ตฌ๋ ํ๋ ํํ๋ก ์ด๋ฃจ์ด์ง.
- Observable์ ์ด๋ค ๊ตฌ์ฑ์์๋ฅผ ๊ฐ์ง๋ next ์ด๋ฒคํธ๋ฅผ ๊ณ์ํด์ ๋ฐฉ์ถ(emitting)ํจ.
- Next, Error, Completed ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ ์ ์์.
- Next ์ด๋ฒคํธ๋ ์ฌ๋ฌ ๋ฒ ๋ฐ์ํ ์ ์์ง๋ง Error๋ Completed ์ด๋ฒคํธ๋ ํ๋ฒ๋ง ๋ฐ์ํจ
- Error๋ Completed ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋ ์ด์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ์ง ์์.
- onNext : Observable์ด ๋ฐฐ์ถํ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ ๋ฐ์.
- onError : Observable์ด ์ํ๋ ๊ฐ์ด ์๋๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ด ๋ฉ์๋๋ฅผ ํธ์ถํจ. ์ค๋ฅ ์ ๋ณด ๊ฐ์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ ๋ฐ๊ณ onNext๋ onCompleted ๋ฉ์๋๋ ํธ์ถ๋์ง ์์.
- onCompleted : Observable์ ์ ์์ ์ธ ๋์ ์ดํ ์ ์ผ ๋ง์ง๋ง์ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํจ.
Operator
- ์ฐ์ฐ์๋ Observable ์์์ ๋์ํ๊ณ Observable์ ๋ฆฌํดํจ.
- ์ฐ์์ผ๋ก ํธ์ถ ๊ฐ๋ฅํ ์ฐ์ฐ์ ์ฒด์ธ์ ์ ๊ณตํจ. ํธ์ถ ์์์ ๋ฐ๋ผ ์คํ ๊ฒฐ๊ณผ ๊ฐ์ด ๋ฌ๋ผ์ง ์ ์์ผ๋ฏ๋ก ์ ์!
Scheduler
- Observable Operator Chain์ ๋ฉํฐ์ค๋ ๋๋ฅผ ์ฝ๊ฒ ์ ์ฉํ ์ ์์.
- ์ฉ๋์ ๋ฐ๋ผ ๋ค์ํ Scheduler๋ฅผ ์ ํํ ์ ์์.
- DispatchQueue์ ๋์ผํ ๊ธฐ๋ฅ
Subject
- Observer์ Observable์ ์ฑ๊ฒฉ์ ๋ชจ๋ ๊ฐ์ง๊ณ ์์ด์, ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ ์๋ ์๊ณ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ ์๋ ์์.
- subject๋ Next ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ณ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ๋๋ง๋ค subscriber์๊ฒ ๋ฐฉ์ถํจ.
- ํ๋ ์ด์์ Observable์ ๊ตฌ๋ ํ ์ ์์.
- subscriber๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด subject์ ์๋ก์ด ๊ฐ์ ์ถ๊ฐํด๋ ์คํ๋์ง ์์.
- AsyncSubject : Completed ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋๋ ์์ ์ ๋ง์ง๋ง์ผ๋ก ์ ๋ฌ๋ Next ์ด๋ฒคํธ๋ฅผ subscriber๋ก ๋ฐฉ์ถ
- PublishSubject : ๋น ์ํ๋ก ์์ํ์ฌ ์๋ก์ด ๊ฐ๋ง subscriber์๊ฒ ๋ฐฉ์ถ
- BehaviorSubject : ํ๋์ ์ด๊ธฐ๊ฐ์ ๊ฐ์ง ์ํ๋ก ์์. ์๋ก์ด subscriber์๊ฒ ์ด๊ธฐ๊ฐ ๋๋ ์ต์ ๊ฐ์ ๋ฐฉ์ถ
- ReplaySubject : ๋ฒํผ๋ฅผ ๋๊ณ ์ด๊ธฐํ. ๋ฒํผ ์ฌ์ด์ฆ ๋งํผ์ ๊ฐ๋ค์ ์ ์งํ๋ฉด์ ์๋ก์ด subsucriber์๊ฒ ๋ฐฉ์ถ
Relay
- UI ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ์ฌ์ฉํจ.
- RxCocoa๋ฅผ importํด์ ์.
- Error์ Completed๊ฐ ์๊ณ dispose ํ ๋๊น์ง ์ข ๋ฃ๋์ง ์์.
- PublishRelay : PublishSuject์ Wrapper ํด๋์ค. ๊ตฌ๋ ์ดํ์ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํจ.
- BehaviorRelay : BehaviorSubject์ Wrapper ํด๋์ค. ํ์ฌ์ ๊ฐ ์ํ๋ฅผ ๋ณด์กดํจ. ๊ฐ์ฅ ์ต์ /์ด๊ธฐ๊ฐ๋ง์ ์๋ก์ด subscriber์๊ฒ ๋ฐฉ์ถํจ.
ํ๋ก์ ํธ์ RxSwift import ํ๋ ๋ฐฉ๋ฒโจ
- Swift Package Manager
import RxSwift