λΉλκΈ° νλ‘κ·Έλλ°μ΄λ?
λ€μ΄κ°κΈ°μ μ
Rx, Reactive Programmingμ΄ λΉλκΈ° νλ‘κ·Έλλ°μ μνκΈ° μν λ Έλ ₯μ΄λΌκ³ μ΄μ μκ°(Reactive Programming νΈ)μ μ΄μΌκΈ°νλλ° κ·ΈλΌ λΉλκΈ°? λΉλκΈ° νλ‘κ·Έλλ°μ΄ 무μμΌκ°μ? κ°λ¨νκ² μ΄ν΄λ³΄λλ‘ νμ£ .
λΉλκΈ° νλ‘κ·Έλλ°?
iOS μ±μ λ€μκ³Ό κ°μ μμ μ μνν μ μμ΅λλ€.
- λ²νΌ ν(ν΄λ¦)μ λ°μνκΈ°
- ν€λ³΄λλ₯Ό ν μ€νΈ νλλ‘ μ λλ©μ΄μ νλ©΄ ν¬μ»€μ€κ° μ¬λΌμ§
- μΈν°λ·μμ ν° μ¬μ§ λ€μ΄λ‘λ → λ€μ΄λ‘λ μ€μ λ€λ₯Έ μμ μ μν
- λ°μ΄ν° λΉνΈλ₯Ό λμ€ν¬μ μ μ₯
- μ€λμ€ μ¬μ

μΆμ² : Raywenderich - μ¬κΈ° ν΄λ¦
ν λ² μκ°μ ν΄λ³΄λ©΄ κ°κ°μ μμ λ€μ μλ‘μ μ€νμ μ°¨λ¨νμ§ μμ΅λλ€.
μλ‘ λ€λ₯Έ μ€λ λμμ μλ‘ λ€λ₯Έ μμ μ μνν μ μλλ‘ iOSλ λ€μν μ’ λ₯μ APIλ₯Ό μ 곡ν©λλ€.
Appleμ Cocoa and UIKit asynchronous APIs (λΉλκΈ° API)
ν λ²μ―€ μ¬μ©ν΄λ΄€κ±°λ λ€μ΄λ³Έ λ΄μ©μΌ κ²μ
λλ€.
Appleμ iOS SDKμμ λΉλκΈ°μ μ½λλ₯Ό μμ±ν μ μλλ‘ λ€μκ³Ό κ°μ λ°©λ²λ€μ μ 곡νκ³ μμ΅λλ€.
- NotificationCenter
- Delegate Pattern
- Grand Central Dispatch(GCD)
- Closures
- Combine - iOS13λΆν° μ΄μ©κ°λ₯ν API
λλΆλΆμ ν΄λμ€λ€μ κ°λ°μμ μλμ λ€λ₯΄κ² λΉλκΈ°μ μΌλ‘ μννκ³ ,
UI μμμ κ²½μ°λ λ³Έμ§μ μΌλ‘ λΉλκΈ°μ μ
λλ€.
κ°λ°μκ° μ± μ½λλ₯Ό μμ±νμ λ, λ§€λ² μ΄λ€ μμλ‘ μλνλ€κ³ κ°μ νλ κ²μ λΆκ°λ₯ν©λλ€.
μ¬μ©μμμ μΈν°λμ
, λ€νΈμνΉ, μ΄λ²€νΈ λ±μ μΈλΆ μμΈμ μν΄ μμ ν λ€λ₯Έ μμλ‘ μ€νλ μ μμ΅λλ€.
λΉλκΈ° νλ‘κ·Έλλ°μ νλ€ λ³΄λ©΄ κ°κ² λλ λ¬Έμ μμ
π£ ν΄λμ€μ ν¨μμ μλ μμλ₯Ό 보μ₯ν μ μμ΅λλ€!
μ΄λ€ κ²μ΄ λ¨Όμ 리ν΄λ μ§, μλ μμλ₯Ό 보μ₯ν μ μκΈ° λλ¬Έμ μ½λλ₯Ό μμ±νλ€λ³΄λ©΄ μμ°μ€λ½κ² λμ€κ° 볡μ‘ν΄μ§λ μ½λκ° λ§λ€μ΄μ§λλ€.
μ½λ μμ)
IBAction func onLoad() {
editView.text = ""
self.setVisibleWithAnimation(self.activityIndicator, true)
downloadJson(MEMBER_LIST_URL) { json in
self.editView.text = json
self.setVisibleWithAnimation(self.activityIndicator, false)
self.downloadJson(MEMBER_LIST_URL) { json in
self.editView.text = json
self.setVisibleWithAnimation(self.activityIndicator, false)
}
self.downloadJson(MEMBER_LIST_URL) { json in
self.editView.text = json
self.setVisibleWithAnimation(self.activityIndicator, false)
}
self.downloadJson(MEMBER_LIST_URL) { json in
self.editView.text = json
self.setVisibleWithAnimation(self.activityIndicator, false)
}
self.downloadJson(MEMBER_LIST_URL) { json in
self.editView.text = json
self.setVisibleWithAnimation(self.activityIndicator, false)
}
}
}
π£ μ²λ¦¬ν΄μΌ ν μμ
μ΄ λ§μμ§ κ²½μ° μ½λκ° λ³΅μ‘ν΄μ§λ€.
Swift κ°λ°μ νλ€λ³΄λ©΄ Escaping Closure λ° Completion Handlerλ₯Ό μ¬μ©νλ λΉλκΈ° νλ‘κ·Έλλ°μ λ§μ΄ νκ² λ©λλ€.
λ§μ λΉλκΈ° μμ
, μ€λ₯ μ²λ¦¬, λΉλκΈ° νΈμΆ κ°μ μ μ΄ νλ¦μ΄ 볡μ‘ν λ λ¬Έμ κ° μκΈ°κ² λ©λλ€.
κΈ°λ³Έμ μΌλ‘ Appleμμ μ 곡νλ API(ex. GCD)λ₯Ό μ¬μ©ν΄μ λΉλκΈ° νλ‘κ·Έλλ°μ νλ©΄μλ μ¬λ¬ λ¬Έμ μ μ λλΌκ² λμ£ .
DispatchQueueλ ν΄λ‘μ λ§μΌλ‘λ λΉλκΈ° νλ‘κ·Έλλ°μ΄ κ°λ₯μ νμ§λ§ μ²λ¦¬ν΄μΌν μμ
μ΄ λ§μμ§ κ²½μ° μ½λκ° λ§€μ° λ³΅μ‘ν΄μ§λ λ¬Έμ κ° μκΈ°κ² λ©λλ€.
π£ λΉλκΈ° μμ
μ κ²½μ° μ¦μ κ²°κ³Όκ° λμ€μ§ μλλ€.
λμ€μ λ°μ΄ν°κ° μ€λ©΄ μ²λ¦¬νλ λ°©μμΌλ‘ μ½λλ₯Ό μ§κ³ μΆμ΅λλ€. Completion Handler λ§κ³ Return κ°μΌλ‘ μ²λ¦¬νκ³ μΆμκ±°μ£ .
κ·Έκ²μ κ°λ₯νκ² ν΄μ£Όλ κ²μ΄ Rxμ Observableμ
λλ€. (μ°λ¦¬λ RxSwiftμμμ Observable μ΄κ² μ£ ?)
λμ€μ λ€μ μμλ³΄κ² μ§λ§ μ 리ν΄λ³΄λ©΄ λ€μκ³Ό κ°μ΅λλ€.
λΉλκΈ° λΌμ΄λΈλ¬λ¦¬μμ νμν 4κ°μ§
λͺ¨λ λΉλκΈ°μμ μ μ²λ¦¬νλ λΌμ΄λΈλ¬λ¦¬μμ νμν κ²μ λ€μκ³Ό κ°μ΅λλ€.
λλ¨Έμ§ νλͺ©μ λν μμΈν λ΄μ©μ μ¬κΈ°μμ μ½μ΄λ³΄μΈμ.
μ°λ¦¬λ μ΄ μ€μμ μ€λ λ κ΄λ¦¬μ μ§μ€ν΄λ΄
μλ€.
- λͺ μμ μ€ν(Explicit execution)
- μλ‘μ΄ μ€λ λμμ μμ μ μμνλ©΄ κ·Έκ²μ 컨νΈλ‘€ν μ μμ΄μΌ νλ€.
- μ¬μ΄ μ€λ λ κ΄λ¦¬(Easy thread management)
-
π£ λΉλκΈ°μμ μμ μ€λ λ κ΄λ¦¬κ° ν΅μ¬μ΄λ€. λ°±κ·ΈλΌμ΄λ μμ λμ€μ΄λ μμ μ΄ λλ ν, (μλ₯Ό λ€λ©΄ λ€νΈμνΉ μ²λ¦¬ ν) λ©μΈμ€λ λμμ UIλ₯Ό μ λ°μ΄νΈν΄μΌ ν λκ° μλ€. μ΄ λ μ€λ λ(λ°±κ·ΈλΌμ΄λ) → λ€λ₯Έ μ€λ λ(λ©μΈ)λ‘ μμ μ λκ²¨μΌ νλλ° μ€λ λλ₯Ό μ½κ² μ ννκ³ νμν κ²½μ° λ€λ₯Έ μ€λ λλ‘ μμ μ λκΈΈ μ μμ΄μΌ νλ€. - μ¬μ΄ ꡬμ±λ ₯(Easily composable)
- λΉλκΈ°μμ μ μμ±νκ³ μμνλ©΄ κ·Έκ²μ λ€λ₯Έ μ΄λ€ μ€λ λμ μμ‘΄νμ§ μκ³ μμ μ΄ λλ λκΉμ§ λ 립μ μΌλ‘ μ μ§νλ κ²μ΄ μ’λ€.
- λΆμμ© μ΅μν(Minimum the sid effects)
- λ©ν° μ€λ λκ° μνλλ λμ μ€λ λ μλ‘ κ° μν₯μ λΌμΉλ λΆμμ©μ μ΅μνν΄μΌνλ€.
λ§λ¬΄λ¦¬ μκ°
λΉλκΈ° νλ‘κ·Έλλ°
μ°λ¦¬λ κ°λ°μ νκ² λ λ νμλΆκ°κ²°νκ² λΉλκΈ° νλ‘κ·Έλλ°μ νκ² λ©λλ€. λ€νΈμν¬ ν΅μ λ§μ 보λλΌλ μ°λ¦¬λ μλ²μμ λ°μ΄ν°λ₯Ό λ°μμ¬ λ κ²°κ³Ό λ°μ΄ν°κ° μΈμ λμ°©ν μ§ λͺ¨λ₯΄κ³ , κ²°κ³Ό λ°μ΄ν°κ° λμ°©νλ©΄ μ΄λ€ μ²λ¦¬λ₯Ό νκ² λμ£ ? μ΄μ²λΌ μ°λ¦¬λ μμ μ λν μμλ₯Ό νμ 보μ₯ν μ μμ΅λλ€. κ·Έλ κΈ° λλ¬Έμ λΉλκΈ°μ νλ‘κ·Έλλ°μ΄ νμν κ²μ λλ€.
λ¬Έμ μ
λΉλκΈ°μ νλ‘κ·Έλλ°μ ν λμ λ³΄ν΅ Closureμ Completion handlerλ₯Ό μ΄μ©ν΄μ μ½λλ₯Ό μμ±ν©λλ€. μ΄ κ²½μ° μμ μ΄ λ§μμ§ κ²½μ° μ½λκ° λ³΅μ‘ν΄μ§ μ μμ΅λλ€. 리ν΄κ°μ λ°μμ μ²λ¦¬νκ³ μΆλ€λ μκ°μ΄ μμ°μ€λ½κ² λ€κ² λλλ° μ΄ λ μ°λ¦¬λ RxSwiftλ₯Ό μ΄μ©ν μ μμ΅λλ€.
μμ½
λΉλκΈ° νλ‘κ·Έλλ°μ΄λ κ°κ°μ μ€λ λκ° λ
립μ μΌλ‘ μκΈ° μμ
μ μννλ κ²μ μλ―Ένκ³ , κ·Έλ κΈ° λλ¬Έμ μμ
μμλ₯Ό 보μ₯ν μ μλ€.
κ°λ¨νκ² λ§νλ©΄ μ΄λ€ μ€λ λκ° λ¨Όμ μμ
μ λ§μΉ μ§ μ μ μλ€λ κ²μ΄λ€.
λ νΌλ°μ€
https://gaki2745.github.io/swift/2019/10/13/Swift-RxSwift-01/
https://zeddios.tistory.com/1230
https://duda-programming.tistory.com/48