iOS/π RxSwift ⁄ Combine
[RxSwift] Observables
woozzang
2021. 12. 20. 09:50
μ°Έκ³ μλ£
- KxCoding
- rayWendelich
λͺ©ν
- Observable μ νΉμ§μ?
- Observable μ λ§λλ λ κ°μ§ λ°©λ²μ μ΄ν΄νλ€
- Observable μ μ¬μ©νλ λ°©λ²μ μ΄ν΄νλ€
μ΅μ λ²λΈμ΄ λκ°μ?
Rx μ μ¬μ₯ π
- Rx μμ λͺ¨λ κ²μ:
- μνμ€ μ΄κ±°λ
- μνμ€μ ν¨κ» λμνλ κ²λ€
Observable, Observable sequence, Sequence λ λͺ¨λ μ΅μ λ²λΈμ κ°λ¦¬ν€λ λ§
- μνμ€μΈλ° λΉλκΈ° μνμ€μ΄λ€.
- μνμ€λ μΌμ κΈ°κ° (μ ν ~ 무ν) λμ μ΄λ²€νΈλ₯Ό μμ°νλ€.
- μ΄κ²μ μ΄λ²€νΈλ₯Ό λ°©μΆνλ€κ³ νννλ€.
- μ΅μ λ²λΈμ μ΅μ λ²κ° ꡬλ νλ€.
μ΄λ²€νΈμ λ°©μΆμ νΉν λ§λΈ λ€μ΄μ΄κ·Έλ¨μΌλ‘ μ΄ν΄νλ©΄ νΈνλ€:
- μκ°μ μΌμͺ½μΌλ‘ μ€λ₯Έμͺ½μΌλ‘ νλ₯Έλ€ β°
- λ§λΈ κ° κ°κ²©μ΄ νΉμ ν μκ°μ ν¬κΈ°λ₯Ό λνλ΄λ κ²μ μλλ€
- μ΄λ²€νΈ μ ν κ΄κ³λ₯Ό ννν λΏ
- νλμ λ§λΈμ΄ [νλμ μ΄λ²€νΈ] λ₯Ό κ°λ¦¬ν¨λ€
- κ°μ₯ μ€λ₯Έμͺ½μ 보μ΄λ vertical bar λ μνμ€μ μ’
λ£ μμ μ κ°λ¦¬ν¨λ€
- β λ§ν¬λ μλλ° [μλ¬ μ΄λ²€νΈμ λ°μ] μ κ°λ¦¬ν¨λ€.
κ°λ¨ μ 리!
- μ΅μ λ²λΈ(μνμ€) λ elements (λ³΄ν΅ λ°μ΄ν°, μΈμ€ν΄μ€) λ₯Ό ν¬ν¨νκ³ μλ next μ΄λ²€νΈλ₯Ό λ°©μΆνλ€!
- μ΅μ λ²λΈμ error κ³Ό completed μ΄λ²€νΈλ‘ μ’ λ£λλ€
- μ’ λ£λ μ΅μ λ²λΈμ λμ΄μ μ΄λ²€νΈλ₯Ό λ°©μΆνμ§ μλλ€.
μ΄λ²€νΈλ μ΄κ±°ν, 3κ°μ§ μΌμ΄μ€λ:
- next(Element) μ°κ΄ κ°μΌλ‘ Obsevable μ νμ νλΌλ―Έν°λ‘ μ μλ νμμ κ°μ΄ λ€μ΄μλ€.
- error(Swift.Error)completed μ λ§μ°¬κ°μ§λ‘ μ΄ν μνμ€κ° μ’ λ£λλ€.
- Error νλ‘ν μ½μ μ±νν νμ μ κ°μ΄ μ°κ΄ κ°μΌλ‘ λ€μ΄μλ€.
- completedμνμ€κ° ‘μ±κ³΅μ μΌλ‘ μ’ λ£λμμ’ μ μ리λ μν λ νλ€.
- μνμ€ μ’ λ£ μ λ§μ§λ§ μ΄λ²€νΈ
Observables λ₯Ό λ§λλ λ°©λ²!
- λ¨, λ§λ λ€κ³ μ΄λ²€νΈλ₯Ό λ°©μΆνλ κ²μ΄ μλμ κΈ°μ΅νμ
- subscribe ν΄μΌ μ΄λ²€νΈκ° λ°©μΆλλ€
- create λ₯Ό μ¬μ©
- μ΄λ€ μ΄λ²€νΈλ₯Ό μ΄λ»κ² μ λ¬ν μ§ μ§μ μ μν΄μ€ μ μλ€
- μ΅μ λ²λΈμ Disposable μ λ°νν΄μΌνλ κ²μ μκΈ°νμ
- return Disposable.create()
- operator λ₯Ό μ¬μ©
- μ΄κ² νμ λ©μλλ¬λ νμ¬κ° μλ‘μ΄ Observablesλ₯Ό λ°ννλ€
- νμ λ©μλλ‘ λ§λ€ μλ μκ³ , μΈμ€ν΄μ€ λ©μλλ‘ λ§λ€ μλ μλ€.
Observable ꡬλ νκΈ°
- μ΅μ λ²λΈμ ꡬλ
μκ° μκΈ°κΈ° μ κΉμ§ μ΄λ²€νΈλ₯Ό λ°©μΆνμ§ μλλ€
- ꡬλ μ μμλμ΄μΌ μ΄λ²€νΈ λ°©μΆμ μμνλ€
- μ΅μ λ²λΈ μ체λ μνμ€μ λν μ μμΌ λΏμ΄λ€
func subscribe(_ on: @escaping (Event<Int>) -> Void) -> Disposable
- Event νμ
μ element λΌλ μμ±μ κ°μ§κ³ μκ³ , μ΄λ²€νΈκ° κ°μ§κ³ μλ μ°κ΄ κ°μ΄λ€.
- μ°λ¦¬κ° μ λ§λ‘ κ΄μ¬μλ κ·Έ κ°
- μ μ½λμμλ Int νμ
μ element λ₯Ό κ°μ§κ³ μλ€.
- μ λ€λ¦μ΄λ―λ‘ μ΅μ λ²λΈμ μ μμ λ°λΌ μ μ°νκ² λ°λμ μΈμ§νμ
.empty()
- μ무 μ΄λ²€νΈλ λ°©μΆνμ§ μκ³ , λ°λ‘ completed μ΄λ²€νΈλ₯Ό λ°©μΆνκ³ μ’ λ£λλ μνμ€
- λ³΄ν΅ Void νμ μΌλ‘ μ§μ νλ€
Observable<Void>.never()
.never()
- μκ²λ μν¨ γ γ ..
Disposing & Terminating
- subscribe κ° μνμ€λ₯Ό μμνλ€λ©΄, error μ completed κ° μνμ€λ₯Ό μ’ λ£ μν¨λ€.
- κ·Έλ°λ° μνμ€λ₯Ό μλμΌλ‘ μ’
λ£μν€λ λλ€λ₯Έ λ°©λ²μ΄ μλ€.
- μνμ€λ₯Ό μ’ λ£μν¨λ€ = ꡬλ μ μ·¨μνλ€ , μ 리νλ€ (dispose)
- subscribe λ©μλλ Disposable νμ
μΈμ€ν΄μ€λ₯Ό λ°ννλ€.
- μ΄ νμ μ dispose λΌλ λ©μλλ₯Ό κ°μ§κ³ μλ€
- νΈμΆνλ©΄ ꡬλ μ΄ μ·¨μλλ€!
- subscription.dispose()
- μΌμΌμ΄ μ΄λ κ² κ΅¬λ
μ κ΄λ¦¬νλ κ²μ μ₯ν©νλ€
- DisposeBag μ Disposable λ€μ λ£μ΄λ§ λλ©΄, DisposeBag μ΄ λ©λͺ¨λ¦¬ ν΄μ λλ μμ μ κ΄λ ¨ μμλ€μ μ 리ν΄μ€λ€.
- μ΄κ²μ΄ κ°μ₯ μμ£Όμ°λ ν¨ν΄!
- disposed(by:)
- disposeBag μ΄ μμμ νλμ© dispose()λ₯Ό νΈμΆν΄μ€ κ²μ΄λ€.
// 1 let disposeBag = DisposeBag() // 2 Observable.of("A", "B", "C") .subscribe { // 3 print($0) } .disposed(by: disposeBag) // 4
- μ΄λ°μμΌλ‘ μ 리ν΄μ£Όμ§ μμΌλ©΄ λ©λͺ¨λ¦¬ λ¦μ΄ λ°μνλ€.
μ΅μ λ²λΈ ν©ν 리 μμ±νκΈ°
- deffered Operator μ¬μ©
- 첨보λλ??
- μλ‘μ΄ κ΅¬λ
μ΄ μμλ λλ§λ€ flip μ μνκ° λ³κ²½λλ€
let disposeBag = DisposeBag() // 1 var flip = false // 2 let factory: Observable<Int> = Observable.deferred { // 3 flip.toggle() // 4 if flip { return Observable.of(1, 2, 3) } else { return Observable.of(4, 5, 6) } }
- filp μ λ°λΌ λ€λ₯Έ μ΅μ λ²λΈμ λ°ννλ€
Traits μ¬μ©νκΈ° ( λμ€μ νμν λ μ 리νμ )
Traits λ κΈ°μ‘΄ μ΅μ λ²λΈλ³΄λ€ μ νλ λμμ μννλ μ΅μ λ²λΈμ΄λ€.
μ¬μ©ν΄λλκ³ μ¬μ©νμ§ μμλ λλ€.
μ½λμ μλλ₯Ό λͺ ννκ² ν΄μ€λ€.
- μ§κ΄μ μΈ μ½λμ μμ± κ°λ₯
μ’ λ₯
- Single
- Maybe
- Completable
Challenge π₯
- do μ°μ°μμ μ¬μ©
- event μ μν₯μ μ£Όμ§μλ μμ
μ ν μ μκ² ν΄μ€λ€
- μ¦, νλΌλ―Έν°λ λ°λ‘ μλ νΈλ€λ¬λ₯Ό ꡬνν μ μλ€.
- onNext, afterNext, onSubscribe λ± λ€μν μμ μ ν μ΄λ€ λμμ μ μν μ μλ€.
- μ°μ°μμ΄λ―λ‘ μ΅μ λ²λΈμ λ°ννλ€.
- event μ μν₯μ μ£Όμ§μλ μμ
μ ν μ μκ² ν΄μ€λ€
- debug μ°μ°μμ μ¬μ©
- μ΅μ λ²λΈμ΄ λ°©μΆνλ μ΄λ²€νΈ μ 보λ₯Ό λ³Ό μ μλ€!!!!!!!
- identifier λ₯Ό μ λ¬νλ©΄ μ΄λ μ΅μ λ²λΈμμ λ°μνλ μ΄λ²€νΈμΈμ§ νμΈν μ μκΈ° λλ¬Έμ μ’λ€!!!!
- νΉν 체μ΄λ μν©μμ
observable .debug("ν μ€νΈ", trimOutput: false) .subscribe( onNext: { element in print(element) }, onCompleted: { print("Completed") } ).disposed(by: DisposeBag())
- κ²°κ³Ό
--- Example of: never --- 2021-12-20 00:36:22.756: ν μ€νΈ -> subscribed 2021-12-20 00:36:22.757: ν μ€νΈ -> isDisposed
μ€λλ λλ μ±μ₯νλ€!!π₯
π€π’[μ°μ§±μ iOS λΈλ‘κ·Έ]π΅π»
iOSλ₯Ό 곡λΆνλ©΄μ λ°°μ΄ λ΄μ©μ κΈ°λ‘νκ³ μμ΅λλ€.