Observing
μ΄λμ λ§μ΄ λ³Έκ±° κ°μλ°β¦
RxSwift
λ₯Ό 곡λΆνμ λΆμ΄λΌλ©΄ Observable
λΌλ λ¨μ΄κ° μ΅μν κ² κ°μ΅λλ€.
Observable
λ κ°μμλΌλ λ»μ κ°μ§κ³ μκ³ Observing
μ κ°μνλ€λ λ»μ κ°μ§κ³ μμ΅λλ€. κ·Έλ¬λ©΄ μ§κΈλΆν° KVO
λ μ΄λ€ κ²μ κ°μνλμ§ μμ보λλ‘ ν κΉμ?
κ²°λ‘ λΆν° λ§μλ리μλ©΄ KVO
λ λ€λ₯Έ μ€λΈμ νΈμ μμ±μ κ°μνλ μν μ ν©λλ€.
μμ§ μ μ λΏμ§ μλλ°μ©β¦
μλ λ μμΈν μ€λͺ μ ν΄λλ¦¬κ² μ΅λλ€.
- νΉμ ν€ κ°μ λ³νλ₯Ό κ°μ§κΈ° μν κΈ°λ₯
- κ°μ²΄μ νλ‘νΌν° λ³κ²½ μ¬νμ λ€λ₯Έ κ°μ²΄μ μ리기 μν΄ μ¬μ©νλ μ½μ½μ νλ‘κ·Έλλ° ν¨ν΄
Model
κ³ΌView
κ°μ΄ λ Όλ¦¬μ μΌλ‘ λΆλ¦¬λ ννΈκ°μ λ³κ²½ μ¬νμ μ λ¬νλλ° μ μ©νλ€KVO
λ λͺ¨λΈ λ μ΄μ΄μ λ·° λ μ΄μ΄ κ°μ΄ λ Όλ¦¬μ μΌλ‘ λΆλ¦¬λμ΄ μλ μ€λΈμ νΈ κ° λ©μΈμ§λ₯Ό μ λ¬ ν©λλ€.- νμ
μ μ μΈλΆμμ
obsever
λ₯Ό μΆκ°ν λ μ¬μ©νλ€.
KVO
λ₯Ό μκ°ν ν΄λ³Όκ²μ.
κ° λ³κ²½ -> κ°μνκ³ μλ μ€λΈμ νΈ ν¨λ€λ¬κ° νΈμΆλ¨ -> handler μλ
μ λμμ΄ μκ°λ³΄λ€ μ΄λ ΅μ§ μμ£ ??
μ΄μ 본격μ μ€λͺ γ γ ‘β¦
μ! λ§λ€ KVO
λ₯Ό μκΈ° μν΄μ μ¬μ μ μκ³ κ°μΌνλ μ§μμ΄ μμ΅λλ€.
KVO
λ₯Ό μ¬μ©νκΈ° μν΄μλ NSOject
λ₯Ό μμν΄μΌν©λλ€.
μμμ λ°μμΌνκΈ° λλ¬Έμ, Class
μμλ§ μ¬μ©μ΄ κ°λ₯νκ³ μ.
observe νλ €λ νλ‘νΌν°μ @objc attribute
μ dynamic modifier
λ₯Ό λΆμ¬μ£Όμ΄μΌν©λλ€.
μ΄λ Dynamic modifier
μ΄ μ μΈλ λΆλΆμ νν΄ Objc λ°νμ λ°©μμ μ¬μ©νκ² λ€λ κ²μ΄κ³ , λ°νμ μμ μ νΈμΆν΄μΌ ν νΉμ λ©μλμ ꡬνμ κ²°μ νλ κ²μ΄λ€.
κ°μμ μν μ νλ μΈμ€ν΄μ€λ ν κ° μ΄μμ μμ±μ κ°μν μ μμ΅λλ€.
κ°μμμ μΈμ€ν°μ€λ observe(_:options:changeHandler:)
λ©μλμ κ°μλ₯Ό μνλ μμ±μ key-pathλ₯Ό μ λ¬νλ κ²μ
λλ€. νΈμΆνλ μμ λΆν° μμ±μ κ° λ³κ²½μ κ°μν©λλ€.
- νλΌλ―Έν°μλ
\.objectToObserve
λobjectToObserve
μΈμ€ν΄μ€μ μμ key pathμ λλ€. - νλΌλ―Έν°μΈ
[.old, .new]
λ λ§μ§λ§ νΈλ μΌλ§ ν΄λ‘μ μoldValue
μnewValue
λΌλ μμ±μ μ¬μ©μ¬λΆ κ²°μ μ ν΄μΌν©λλ€.oldValue
λ λ³κ²½ μ§μ μ μμ±μ κ°μ΄κ³ ,newValue
λ λ³κ²½ μ΄ν μμ±μ κ°μ λλ€.
- νλΌλ―Έν°λ ν΄λ‘μ λ‘, κ° λ³κ²½μ μνν λμμ μ μν΄μΌν©λλ€.
κ²°λ‘ μ 첫λ²μ§Έ νλΌλ―Έν°μμ λ°λ κ²μ κ°μμ μν μ νλ μ€λΈμ νΈκ° μ λ¬μ΄λκ³ λλ²μ§Έ νλΌλ―Έν°μ NSKeyValueObservedCange<Value>
νμ
μ κ°μ΄ λ€μ΄μ€λλ°, μ΄ κ°μμ oldValue
μ newValue
μ μ κ·Ό ν μ μμ΅λλ€.
λ§μ½ observe
λ©μλμ options
νλΌλ―Έν°μ μ무κ²λ μ λ¬λμ§ μλλ€λ©΄, nil
λ‘ κ°μ΄ μ΄κΈ°νλ©λλ€.
Model
κ°μ²΄μμ κ°μ΄ λ³κ²½ λμμ κ²½μ°, λ³κ²½λ κ°μ UI
μ λ°μν΄μΌν©λλ€.
μ΄λ 컨νΈλ‘€λ¬κ° λͺ¨λΈ κ°μ²΄μ observing
μ λμ
, λΈλ¦¬κ²μ΄νΈμ λ©μΈμ§λ₯Ό λ³΄λ΄ μ²λ¦¬νκ²ν΄μΌν©λλ€.
class Person: NSObject {
@objc dynamic var name: String
init(name: Stirng) {
self.name = name
}
}
var person = Person(name: "Junha")
person.observe(\.name, options: [.old, .new]) { (object, change) in
print("name changed form \(change.oldValue) to \(change.newValue)")
}
person.name = "μ€ν" // Name changed from Optional("Junha") to Optional("λ리")
// μμ μΆμ²[https://velog.io/@jee/KVO-Key-Value-Observing]
νλ‘νΌν° κ°μ΄ Junha
μμ μ€ν
λ‘ λ³κ²½λμ΄μ Observer
μ change handlerκ° νΈμΆ νκΈ° λλ¬Έμ handler
λ΄μ oldValue
μ newValue
λ₯Ό κ°μ Έμ¬ μ μκ² λλ€.
κ·Έλ¦¬κ³ Option
μ old/new
λ§κ³ λ initial
κ³Ό prior
κ° μμΌλ©° μ€λͺ
μ μλμ κ°μ΅λλ€.
-
old
- λ³κ²½ μ κ°
-
new
- λ³κ²½ ν κ°
-
initial
- Observer λ±λ‘ μ handler νΈμΆ μ (newValueλ‘ λ€μ΄κ°λλ€)
- μμ
var person = Person(name: "junha") person.observe(\.name, options: [.old, .new, .initial]) { (object, change) in print("name changed form \(change.oldValue) to \(change.newValue)") } // Name changed from nil to Optional("junha")
-
prior
- λ³κ²½ μ , ν μν λͺ¨λ νμ μ
- μμ
var person = Person(name: "junha") person.observe(\.name, options: [.old, .new, .prior]) { (object, change) in print("Name changed from \(change.oldValue) to \(change.newValue)") } person.name = "μ€ν" // Name changed from Optional("junha") to nil // Name changed from Optional("junha") to Optional("μ€ν")
- λ κ°μ²΄ κ°μ λκΈ°ν
Model
κ³ΌView
κ°μ΄ λΆλ¦¬λ ννΈκ°μ λ³κ²½ μ¬ν μ λ¬
- λ΄λΆ μμ€ λ³κ²½ μμ΄, μν λ³νμ λμν μ μλ€
- λ³κ²½ μ /ν κ°μ νμ ν μ μλ€
- Objc λ°νμμ μμ‘΄ λ° ν΄λμ€λ§ ꡬν κ°λ₯ (
NSObject
μμ) dealloc
λ λ μ΅μ λ²λ₯Ό μ§μμ€μΌ νλ€.
RxSwift
μSubscribe
μ²λΌ λ Όλ¦¬μ μΈ λΆλ¦¬κ° κ°λ₯ν΄μ§λλ€.- μμ
ViewModel
μ μ΄λ€ νλ‘νΌν°κ° λ³νλ₯Ό νμμ λ,view
μμμ λ³νλ₯Ό μ λν λ μ¬μ©μ΄ κ°λ₯ν©λλ€.- νμ§λ§
KVO
μ κ²½μ° objc λ°νμμ μ΄λνκΈ° λλ¬Έμclass
κ°final
μ΄κ±°λstatic dispatch
λ‘ μ¬μ©μ΄ κ°λ₯ν λ, λͺ¨λ objcμ λ°νμμ μ΄μ©ν΄dynamic dispatch
λ₯Ό μ¬μ©νκ² λλ€λ©΄ μ±λ₯μ μ‘°κΈ λ¨μ΄μ§ κ² κ°μ΅λλ€.
- μμ
- μ μΌ ν° μ₯μ μ λ΄λΆμ μ½λλ₯Ό 건λλ¦¬μ§ μκ³ μΈλΆμμ ν΄λΉ κ°μ λ³νλ₯Ό κ΄μ°°ν΄μ λμνλ κ²μ΄ κ°λ₯ν©λλ€.
- λΉμ·ν κΈ°λ₯μΌλ‘
willSet
κ³ΌdidSet
μ κ²½μ°μλclass
λ΄λΆμ ꡬνν΄μΌνμ§λ§KVO
λ₯Ό μ΄μ©νλ€λ©΄ λ Όλ¦¬μ μΈ λΆλ¦¬κ° κ°λ₯ν΄μ μΈλΆμμ κ΄μ°°νλ κ²μ΄ κ°λ₯ν΄μ§λλ€. - μΈλΆ λΌμ΄λΈλ¬λ¦¬ λλ λ¨μ΄ μ§ μ½λ λλ SDKλ₯Ό μ΄μ©νλ λ΄λΆμ μ½λλ₯Ό 건λ€μ΄κΈ° νλ μν©μμ
NSObject
λ₯Ό μμλ°κ³ μ κ·Όμ΄ κ°λ₯νλ€λ©΄ μΈλΆμμ κ΄μ°°ν μ μλ μ€κ³λ₯Ό ν μ μμ΄μ μ©μν©λλ€.- νμ§λ§ μ΄μ μ΄κ²λ
NSObject
λ₯Ό μμ λ°κ³@objc dynamic
μΌλ‘ Objc λ°νμ μ€μ μ κ·Όμ΄ κ°λ₯ν κ²½μ°μλ§ λλ€λ κ² μμμ£ΌμΈμ.
- νμ§λ§ μ΄μ μ΄κ²λ
- λΉμ·ν κΈ°λ₯μΌλ‘
- κΈ°μ‘΄ λ΄μ₯ νλ μμν¬μμ μμ§ objc μ½λκ° swiftλ‘ μ λ¬λμ§ μμ κ³³μμλ
KVO
λ₯Ό μ¬μ©ν΄μ μ κ·Όμ΄ κ°λ₯ν κ²λ€μ΄ μμ΅λλ€.- μλ₯Ό λ€μ΄μ
AVFoundation
κ°μ κ²λ€μ λ΄λΆ λ³μλ€μ μ°Έμ‘°ν λ, μ¬μ©νλ κ²½μ°κ° λ§μ΅λλ€.
- μλ₯Ό λ€μ΄μ
κΈ΄κΈ μ½μ΄μ£Όμ μ κ°μ¬ν©λλ€~~^^