RxSwift
1. RxSwift κ°λ
1) Reactive Programmingμ΄ λ¬΄μμΈμ§ μ€λͺ
ν΄μ£ΌμΈμ.
Reactive Programming μ λ°μ΄ν°μ νλ¦μ λ°μνλ©° λ‘μ§μ ꡬμ±νλ νλ‘κ·Έλλ° ν¨λ¬λ€μμ λλ€.
λ°μ΄ν°μ μνλ³νλ, μ΄λ²€νΈμ λ°λ₯Έ λ‘μ§μ μμ±ν©λλ€.
μ΄ λ, λ°μ΄ν°μ νλ¦μ λΉλκΈ°μ μΌλ‘ μ²λ¦¬ν μ μκΈ° λλ¬Έμ λΉλκΈ° νλ‘κ·Έλλ°μ μ’μ΅λλ€.
ν¨μν νλ‘κ·Έλλ°μ κ²°ν©ν΄ κ°λ μ± μ’κ³ μ μ§λ³΄μ μ’μ μ½λλ₯Ό μ§λ λ° μ μ©ν©λλ€.
2) RxSwift λ₯Ό μ μΌκ³ μ₯λ¨μ μ΄ λκ° μλμ?
λΉλκΈ° μ½λλ₯Ό μ½κ² μμ±ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ λ€νΈμν¬ ν΅μ μ μν΄ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ μμ μ Observable μ λ΄μμ μμ±νλ€λ©΄, Observable μ΄ λ±μ΄λ΄λ onNext, onCompleted λ±μ μ΄λ²€νΈλ₯Ό κΈ°λ°μΌλ‘ λΉλκΈ° μ²λ¦¬λ₯Ό μ½κ² ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ Data Binding μ νΈνκ² μ²λ¦¬ν μ μμ΅λλ€.
ν¨μν νλ‘κ·Έλλ°μ μ§μν©λλ€. map μ΄λ filter λ±μ Operator λ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό κ°κ³΅νκΈ° μ’μ΅λλ€.
λ°μ΄ν° νλ¦μ λ€λ£° λ μ μ©ν ν΄λμ€λ€μ΄ λ§μ΅λλ€. Observable, Subject λ±μ ν΄λμ€λ₯Ό μ¬μ©ν΄μ λ°μ΄ν° νλ¦μ ν¨κ³Όμ μΌλ‘ λ€λ£° μ μμ΅λλ€.
3) RxSwift μ Combine μ°¨μ΄λ₯Ό μ€λͺ
ν΄μ£ΌμΈμ.
RxSwift λ μ νμ΄ λ§λ λΌμ΄λΈλ¬λ¦¬κ° μλλλ€. Rxλ Swift λΏ μλλΌ Java, Python μμλ μ¬μ©λλ λΌμ΄λΈλ¬λ¦¬μ λλ€. λ°λ©΄μ Combine μ μ νμ΄ λ§λ 곡μ λΌμ΄λΈλ¬λ¦¬μ λλ€. μ΄λ‘ μΈν΄ νμλλ νΉμ§μ λ€μκ³Ό κ°μ΅λλ€.
RxSwift λ₯Ό μ¬μ©νμ μ, Rx λ₯Ό μ¬μ©νλ λ€λ₯Έ κ°λ°μλ€κ³Ό μν΅ν μ μμ΅λλ€. λ‘μ§μ ν΅μΌ μν¬ μ μμ΅λλ€.
Combine μ μ¬μ©νμ μ, μ’ λ μμ μ μΈ ν¨κ³Όλ₯Ό κΈ°λν μ μμ΅λλ€. μ΄λλ κ°μκΈ° Rx λΌμ΄λΈλ¬λ¦¬μ λ¬Έμ κ° μκΈ΄λ€λ©΄ 그건 μ νμ μ± μμ΄ μλκΈ° λλ¬Έμ λλ€.
4) RxCocoa λ₯Ό μΈ λ μ₯μ ? μ΄λ€ κ²½νμ νλμ
RxCocoa λ₯Ό μ¬μ©νλ©΄ rx.tap μ ν΅ν΄ λ²νΌ ν μ΄λ²€νΈλ₯Ό Observable λ‘ κ°μ£Όν΄μ λ²νΌ μ΄λ²€νΈλ₯Ό μ²λ¦¬ν μ μμ΅λλ€. κ·Έλ¦¬κ³ throttle μ΄λ debounce λ±μ κΈ°λ₯μ μ½κ² μ²λ¦¬ν μ μμ΅λλ€.
UITableView μ delegate λ©μλλ₯Ό RxCocoa λ₯Ό ν΅ν΄ κΉλνκ² μμ±ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ tableView μ willDisplay λ₯Ό rxcocoa λ₯Ό ν΅ν΄ tableView.rx.willDisplayCell { cell, index .. } λ‘ κΉλνκ² μμ±ν μ μμ΅λλ€.
2. Observable
1) RxSwift μ Observable μ΄λ 무μμΈμ§ μ€λͺ
ν΄μ£ΌμΈμ.
RxSwift μ Observable μ λ°μ΄ν° μ€νΈλ¦Όμ΄λ©°, μ΄λ²€νΈλ₯Ό λ°©μΆνλ ν΄λμ€μ λλ€. μ΅μ λ² ν¨ν΄μ Publisher μ κ°λ€κ³ μκ°ν μ μμ΅λλ€.
Observable μ ꡬλ νκ²λλ©΄, μ΄λ²€νΈκ° λ°μν λλ§λ€ κ·Έμ κ±Έλ§λ νλμ ν μ μκ² λ©λλ€.
next : μΌλ°μ μΈ λ°μ΄ν° or μ΄λ²€νΈ λ°©μΆ
error : μλ¬ λ°©μΆ, μ€νΈλ¦Ό μ’ λ£
complete : μ±κ³΅μ μΈ μ΄λ²€νΈ λ°©μΆ + μ€νΈλ¦Ό μ’ λ£
Observable μ Disposable νμ μ λ°νν©λλ€.
2) RxSwiftμμ Hot Observableκ³Ό Cold Observableμ μ°¨μ΄λ₯Ό μ€λͺ
νμμ€.
Hot Observable μ μ΄λ²€νΈκ° ꡬλ μ¬λΆμ μκ΄μμ΄ λ°μνκ³ μλ€κ°, ꡬλ μ ν μμ λΆν° μ΄λ²€νΈλ₯Ό λ°μλ³Ό μ μλ Observable μ λλ€.
Cold Observable μ ꡬλ μ μμνμ λ λΉλ‘μ μ΄λ²€νΈλ₯Ό λ°©μΆνλ Observable μ λλ€. RxSwiftμ κΈ°λ³Έ Observable μ Cold Observable μ λλ€.
Hot Observable μ TV μ§μν λ°©μ‘, Cold Observable μ λ·νλ¦μ€μ λΉμ ν μ μμ΅λλ€.
3) Single, Completable, Maybeμ μ°¨μ΄μ μ λν΄ μ€λͺ
νκ³ , μΈμ μ μ©νλ©΄ μ’μμ§ μ€λͺ
νμμ€.
λ¨Όμ Single, Completable, Maybe λ λͺ¨λ Observable μ λλ€.
Single μ Success / Error λ μ€ νλλ§μ μ€μ§ νλ²λ§ λ°©μΆν©λλ€. μ νν ν κ°μ§ μμλ₯Ό ν λ²λ§ λ°©μΆν λ μ¬μ©ν©λλ€. μλ₯Ό λ€μ΄, λ€νΈμν¬ μμ²μ 보λ΄κ³ μμ²μ λν μλ΅ νλ² λ°μμΌν κ²½μ° Single μ μ¬μ©ν μ μμ΅λλ€.
Completable μ λ°μ΄ν°λ₯Ό λ°ννμ§ μμΌλ©°, μμ μ΄ μλ£ λμμμ λνλΌ λ μ¬μ©ν©λλ€. μλ₯Ό λ€μ΄, μλ²μ λ°μ΄ν°λ₯Ό 보λ΄λ μμ²μ νκ³ , "μ μ‘ μλ£" or "μ μ‘ μ€ν¨"λ₯Ό μΆλ ₯νκ³ μΆμ κ²½μ° μ¬μ©ν μ μμ΅λλ€.
Maybe λ λ°μ΄ν°λ₯Ό λ°νν μλ μκ³ νμ§ μμ μλ μμ΅λλ€. μ£Όλ‘ "λ°μ΄ν°κ° μλμ§ μ¬λΆ"λ₯Ό λ°ννλ μμ μ μ¬μ©ν©λλ€. μλ₯Ό λ€μ΄ λ‘컬 μ€ν 리μ§μμ λ°μ΄ν°λ₯Ό μ½λ μμ μ μννκ³ λ°μ΄ν°κ° μμΌλ©΄ κ·Έ κ°μ λ°ν, κ·Έλ μ§ μμΌλ©΄ completed λ₯Ό μ¬μ©ν©λλ€.
3.Disposable
1) Disposable μ κ°λ
μ μ€λͺ
ν΄μ£ΌμΈμ
RxSwift μ Disposable μ Observable μ ꡬλ μ ν΄μ νλ λ° μ¬μ©λλ κ°λ μ λλ€.
Observable μ subscribe() λ©μλλ₯Ό ν΅ν΄μ ꡬλ μ μμνκ³ , μ΄ subscribe λ©μλλ Disposable κ°μ²΄λ₯Ό λ°νν©λλ€.
Disposable.dispose() λ₯Ό νλ©΄ ꡬλ μ΄ ν΄μ λ©λλ€.
μλ₯Ό λ€μ΄ Observable μ΄ UI μ΄λ²€νΈλ₯Ό λ°ννλλ°, μ μ κ° κ·Έ νλ©΄μμ λκ°λ€λ©΄ λ μ΄μ κ·Έ Observable μ νμκ° μμ΄μ§ κ²μ΄κΈ° λλ¬Έμ dispose() ν΄μ€μΌ ν©λλ€.
2) DisposeBag μ λν΄μ μ€λͺ
ν΄μ£ΌμΈμ. μΈμ λ©λͺ¨λ¦¬λ₯Ό ν΄μ νλμ?
DisposeBag μ μ¬μ©νλ©΄, ꡬλ μ ν΄μ ν λμλ€μ λ΄μ ν λ²μ dispose μ²λ¦¬ν μ μμ΅λλ€.
DisposeBag μ΄ Dispose() λ©μλλ₯Ό νΈμΆνκ±°λ, DisposeBag μ΄ λ©λͺ¨λ¦¬μμ ν΄μ λ λ, DisposeBag μ ν¬ν¨λ Disposable κ°μ²΄λ€μ΄ ν¨κ» ν΄μ λ©λλ€.
μΌλ°μ μΌλ‘ ViewController λ ViewModel μμ DisposeBag μ μ¬μ©νκ² λλλ°, ν΄λΉ κ°μ²΄κ° λ©λͺ¨λ¦¬μμ ν΄μ λ λ DisposeBag λ ν¨κ» λ©λͺ¨λ¦¬μμ ν΄μ λλ―λ‘ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§ν©λλ€.
4. Subject, Driver, Relay
1) Observable κ³Ό Subject μ μ°¨μ΄λ₯Ό μ€λͺ
ν΄μ£ΌμΈμ
Observable μ Cold Observable μ΄κ³ , Subject λ Hot Observable μ λλ€.
Subject λ Observer μ μν κ³Ό Observable μ μν μ λͺ¨λ ν μ μμ΅λλ€.
μ¦, Observable μ΄κΈ° λλ¬Έμ μ΄λ²€νΈλ₯Ό λ°νν μ μκ³ ,
Observer μ΄κΈ° λλ¬Έμ μ΄λ²€νΈλ₯Ό μμ λ°κ³ , κ·Έ μ΄λ²€νΈμ λ§λ μ²λ¦¬λ₯Ό ν μ μμ΅λλ€.
λ€μλ§νλ©΄, Observer λ μ΄λ€ λ°μ΄ν°λ₯Ό λ³΄λΌ μ§ λ―Έλ¦¬ μ ν΄μ§ ννμ μ€νΈλ¦Όμ΄μ§λ§, Subject λ Subject μΈλΆμμ μλ‘ λ°μ΄ν°λ₯Ό λ£μ΄μ€ μλ μκ³ , ꡬλ λ ν μ μλ μ μ°μ±μ κ°μ§κ³ μμ΅λλ€.
2) Subjectμ μ’
λ₯μ μ°¨μ΄μ μ λν΄ μ€λͺ
νμμ€.
PublishSubject μ BehaviorSubject μ λν΄ μ€λͺ ν΄λ³΄κ² μ΅λλ€.
κ°μ₯ ν° μ°¨μ΄λ μ΄κΈ°κ°μ΄ μλλ μλλ μΈλ°μ, PublishSubject μ κ²½μ°, μλ‘μ΄ κ΅¬λ μκ° μκ²Όμ λ , μ΅κ·Όμ λ°μνλ μ΄λ²€νΈμ κ°μ μ λ¬νμ§ μμ΅λλ€. λ°λ©΄μ BehaviorSubject λ μλ‘μ΄ κ΅¬λ μκ° μκ²Όμ λ, μ΅κ·Όμ λ°μνλ μ΄λ²€νΈμ κ°μ μ λ¬ν©λλ€.
3) Subjectμ Driverμ μ°¨μ΄λ₯Ό μ€λͺ
νμμ€.
Subject μ Driver λ λͺ¨λ RxCocoa μ Observable μ΄μ§λ§, λͺκ°μ§ μ°¨μ΄μ μ΄ μμ΅λλ€.
Subject λ Observer μ Observable μ μν μ λͺ¨λ μνν μ μλ ν΄λμ€μ λλ€.
Observable μ²λΌ μ΄λ²€νΈλ₯Ό λ°©μΆν μ μμ§λ§, μΈμ λ μ§ μλμΌλ‘ μ΄λ²€νΈλ₯Ό μλ‘ μμ λ°μ μμ±ν μ μκΈ° λλ¬Έμ μ μ°ν©λλ€.
Driver λ UI μ΄λ²€νΈλ₯Ό μ²λ¦¬νκΈ° μν΄ μ€κ³λ Observable μ λλ€. UI μ΄λ²€νΈλ λ©μΈ μ€λ λμμ μλν΄μΌ νλ―λ‘, Driver λ μλμΌλ‘ MainScheduler μμ μλλ©λλ€.
λν Driver λ error μ΄λ²€νΈλ₯Ό λ°©μΆνμ§ μμΌλ©°, ꡬλ μ΄ ν΄μ λκΈ° μ κΉμ§ νμ λ©λͺ¨λ¦¬μ μ‘΄μ¬ν©λλ€.
4) Subject μ Relay μ μ°¨μ΄λ₯Ό μ€λͺ
ν΄μ£ΌμΈμ.
곡ν΅μ μΌλ‘λ λ λ€ RxCocoa μ ν¬ν¨λμκ³ , Observer μ μν κ³Ό Observable μ μν μ μνν μ μλ€λ κ²μ λλ€.
μ¦, μ΄λ²€νΈμ λ°νλ ν μ μκ³ , μ΄λ₯Ό ꡬλ ν΄ μ΄λ²€νΈμ κ±Έλ§λ νλ μ²λ¦¬λ₯Ό ν μ μμ΅λλ€.
μ°¨μ΄μ 첫λ²μ§Έλ‘λ, Subject λ RxSwift μ ν΄λμ€μ΄κ³ , Relay λ RxCocoa μ ν΄λμ€λΌλ κ²μ λλ€.
λλ²μ§Έλ‘λ, Subject λ completed λ error λ₯Ό ν΅ν΄μ μ€νΈλ¦Όμ μ’ λ£μν€μ§λ§, Relay λ Dispose κ° λκΈ° μ κΉμ§ κ³μ λμν©λλ€.
μΈλ²μ§Έλ‘λ, Subject μ λ°μ΄ν° μ€νΈλ¦Ό κ° μΆλ ₯μ ꡬλ μ ν΅ν΄ κ°λ₯νκ³ , Relay μ λ°μ΄ν° μ€νΈλ¦Ό κ° μΆλ ₯μ .value λ₯Ό ν΅ν΄μ κ°λ₯ν©λλ€.
5) Driver μ Relay μ μ°¨μ΄λ₯Ό μ€λͺ
ν΄μ£ΌμΈμ.
Driver λ MainScheduler μμ νλνλ κ²μ 보μ₯νκ³ , Relay λ κ·Έλ μ§ μμ΅λλ€.
λ°λΌμ UI μ΄λ²€νΈλ₯Ό μ²λ¦¬ν λ Driver λ₯Ό μ¬μ©νλ κ²μ΄ μ’ λ μ μ νκ³ , Relay λ λΉ UI μ΄λ²€νΈμμλ κ°λ¨νκ² μ²λ¦¬ν λ μ¬μ©νκΈ° μ’μ΅λλ€.
Last updated