-
[iOS] KVO λ? (Key Value Observing)iOS/π€ App 2021. 5. 22. 19:55
1μ°¨ μμ : 2021/06/08
μλ νμΈμ. μ΄λ² μκ°μλ KVO μ λν΄ κ³΅λΆν΄λ³΄κ² μ΅λλ€πΆ
Observing μ΄λΌλ λ¨μ΄λ κ°μνλ€λ μλ―Έλ₯Ό κ°μ§κ³ μμ£ . κ·Έλ λ€λ©΄ KVOλ 무μμ κ°μνλ κ²μΌκΉμ?
λ°λ‘ λ€λ₯Έ μ€λΈμ νΈμ μμ±μ λλ€.
KVO λ B λΌλ μ€λΈμ νΈμ μμ± κ°μ΄ λ³κ²½λμμ λ, A λΌλ μ€λΈμ νΈκ° μκ² λλ κ²μ λλ€.
KVOλ λͺ¨λΈ λ μ΄μ΄μ λ·° λ μ΄μ΄ κ°μ΄ λ Όλ¦¬μ μΌλ‘ λΆλ¦¬λμ΄ μλ μ€λΈμ νΈκ° λ©μμ§ μ λ¬μ μ μ©ν©λλ€.
μλ₯Ό λ€μ΄ λͺ¨λΈ λ μ΄μ΄μμ κ°μ΄ λ³κ²½λλ©΄, κ°μνκ³ μλ λ·° λ μ΄μ΄μκ² μ λ¬λμ΄ λ³κ²½μ λμν μ μλ κ²μ λλ€.
κ°μν μμ±μ νμνκΈ°
class MyObjectToObserve: NSObject { @objc dynamic var myDate = NSDate(timeIntervalSince1970: 0) // 1970 func updateDate() { myDate = myDate.addingTimeInterval(Double(2 << 30)) // Adds about 68 years. } }
κ°μν μ μλ ν΄λμ€μλ μ‘°κ±΄μ΄ νλ μλλ°, λ°λ‘ NSObject λ₯Ό μμν ν΄λμ€μ¬μΌ νλ€λ κ²μ λλ€.
κ·Έλ¦¬κ³ KVOλ₯Ό μννλ €λ©΄ κ°μν μμ±μ @objc μ΄νΈλ¦¬λ·°νΈμ dynamic λͺ¨λνμ΄μ΄λ₯Ό λΆμ¬μ£Όμ΄μΌ ν©λλ€.
μ μ½λμμλ myDate λΌκ³ νλ λ³μκ° κ°μλ₯Ό ν μ μλ μμ±μ΄ λ©λλ€.
κ°μμ μ μνκΈ°
κ°μμ μν μ νλ μΈμ€ν΄μ€λ ν κ° μ΄μμ μμ±μ κ°μν μ μμ΅λλ€.
κ°μλ₯Ό μΆκ°νλ λ²μ κ°μμ μΈμ€ν΄μ€μμ observe(_:options:changeHandler:) λ©μλμ κ°μλ₯Ό μνλ μμ±μ key-path λ₯Ό μ λ¬νλ κ²μ λλ€. νΈμΆνλ μμ λΆν° μμ±μ κ° λ³κ²½μ κ°μν©λλ€.
observe(_:options:changeHandler:) λ©μλμ μ¬μ©μ μλ μ½λμμ μ΄ν΄λ³΄κ² μ΅λλ€.
첫λ²μ§Έ νλΌλ―Έν°μΈ \.objectToObserve.myDate λ objectToObserve μΈμ€ν΄μ€μ myDate μμ±μ key path μ λλ€.
λλ²μ§Έ νλΌλ―Έν°μΈ [.old, .new] λ λ§μ§λ§ νΈλ μΌλ§ ν΄λ‘μ μμ oldValue μ newValue λΌλ μμ±λ₯Ό μ¬μ©μ¬λΆ κ²°μ νλ κ²μ λλ€.
μ¬κΈ°μ oldValue λ λ³κ²½ μ§μ μ μμ±μ κ°μ΄κ³ , newValueλ λ³κ²½ μ΄ν μμ±μ κ°μ λλ€.
μΈλ²μ§Έ νλΌλ―Έν°λ ν΄λ‘μ λ‘, κ° λ³κ²½μ μνν λμμ μ μνμ¬ μ λ¬ν©λλ€.
βοΈμ λ¬ν ν΄λ‘μ λ κ°μμ€μΈ μμ±μ κ°μ΄ λ³κ²½λ λ νΈμΆλ©λλ€.
νΈμΆλ λ μ΄ ν΄λ‘μ μλ λ κ°μ νλΌλ―Έν°μ κ°μ΄ μ λ¬λλλ°, 첫λ²μ§Έ νλΌλ―Έν°μ κ°μμ μν μ νλ μ€λΈμ νΈ (_KeyValueCodingAndObserving νλ‘ν μ½ νμ ) κ° μ λ¬λκ³ ,
λλ²μ§Έ νλΌλ―Έν°μ NSKeyValueObservedChange<Value> νμ μ κ°μ΄ λ€μ΄μ€λλ°, μ΄ κ°μμ oldValue μ newValue μ μ κ·Όν μ μμ΅λλ€.
λ§μ½ observe(_:options:changeHandler:) λ©μλμ options νλΌλ―Έν°μ μ무κ²λ μ λ¬λμ§ μλλ€λ©΄, μ΄ κ°μ nil λ‘ μ΄κΈ°ν λ©λλ€.
μλ μ½λμμλ ν΄λ‘μ μμ κ°κ° object μ change λ₯Ό argument label λ‘ μ¬μ©νκ³ μμ΅λλ€.
class MyObserver: NSObject { @objc var objectToObserve: MyObjectToObserve var observation: NSKeyValueObservation? init(object: MyObjectToObserve) { objectToObserve = object super.init() observation = observe( \.objectToObserve.myDate, options: [.old, .new] ) { object, change in print("myDate changed from: \(change.oldValue!), updated to: \(change.newValue!)") } } }
Property Observer μ λ€λ₯Έ μ μ? π€
Property Observer λ κ°μ κ°μνλ€λ κ°λ μ μ μ¬νμ§λ§,
Property Observer μ κ²½μ° νΈλ€λ¬ μμ²΄κ° κ°μλλ μμ±κ³Ό κ°μ μμΉμ μ μΈλμ΄ μμ΅λλ€.
λ°λ©΄μ KVO λ νΈλ€λ¬κ° κ°μνλ μ€λΈμ νΈμ μ μλμ΄ μμ΅λλ€.
" KVO is for adding observers outside of the type definition."
μ μ½λ( MyObserver) μμλ κ°μλΉνλ μ€λΈμ νΈμ μ°Έμ‘°λ₯Ό κ°μνλ μ€λΈμ νΈκ° κ°μ§κ³ μμ΅λλ€.
λ°λ©΄μ Property Observe rλ‘ μμ μ½λμ κ°μ΄ λμνκ² νλ €λ©΄ κ°μλΉνλ μ€λΈμ νΈκ° κ°μνλ μ€λΈμ νΈμ μ°Έμ‘°λ₯Ό κ°μ§κ³ μκ²λ©λλ€.
νΈλ€λ¬ μμ²΄κ° κ°μ λΉνλ μ€λΈμ νΈμμ ꡬνλμ΄μΌ νκΈ° λλ¬Έμ λλ€. μ΄ λΆλΆμ΄ λ°λμ λλ€.
ꡬνμ λ°λΌ λ¬Όλ‘ μ΄λ° κ΄κ³κ° μκΈ°μ§ μμ μ μμ§λ§, μμ μ½λμ κ°μ΄ ꡬννλ μν©μμλ μλμ κ°μ κ΄κ³κ° μκΉλλ€.
μ΄λ κ² μκ°νλ©΄ κ°μνλ€κ³ 보기λ μ΄λ €μΈ κ² κ°μ΅λλ€.
μ΄λ‘μ iOSμμ λ€λ₯Έ μ€λΈμ νΈμκ² κ°μ λ³κ²½μ μλ €μ£Όλ λ°©λ² μ€ νλμΈ KVOλ₯Ό λ€λ£¨μ΄ 보μμ΅λλ€.
RxSwift λ₯Ό λ°°μ°κΈ° μ μ΄λΌλ©΄ μ΄ λ°©λ²μΌλ‘ MVVM μμ λ·°λͺ¨λΈκ³Ό λ·°μ λ°μΈλ©μ ꡬνν μ μμ κ² κ°μ΅λλ€.
μλ¬Έμ
μμ±μ΄ μ°Έμ‘° νμμΌ λ, μ°Έμ‘° νμ λ΄λΆμ μμ± λ³κ²½μλ λ°μνλκ°?
A: μλλλ€. μ°Έμ‘° νμμ κ°μ μ£Όμ μ΄λ―λ‘ μΈμ€ν΄μ€κ° λ³κ²½λ λ λ°μν©λλ€.
κ΄λ ¨ κΈ : [Swift] κ°νμ κ³Ό μ°Έμ‘°νμ ( Value Type vs Reference Type )
λ!
π€π’[μ°μ§±μ iOS λΈλ‘κ·Έ]π΅π»
iOSλ₯Ό 곡λΆνλ©΄μ λ°°μ΄ λ΄μ©μ κΈ°λ‘νκ³ μμ΅λλ€.μ°Έκ³ μλ£ 1: https://developer.apple.com/documentation/swift/cocoa_design_patterns/using_key-value_observing_in_swift
μ°Έκ³ μλ£ 2:https://www.hackingwithswift.com/example-code/language/what-is-key-value-observing
'iOS > π€ App' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[iOS] DispatchQueue.main.sync { } λ μ΄λ»κ² μλν κΉ? (0) 2021.06.07 [iOS] GCD (Grand Central Dispatch) λ? (feat. main & global dispatch queue) (0) 2021.06.07 [iOS] - Cocoa Touch μμ JSON λ€λ£¨κΈ° (0) 2021.05.07 'νμκΈ λνΉ μ±'μ μ μνλ©΄μ λ°°μ΄ μ νκ³ (0) 2021.03.05 [UIKit] λ·° νκΉ μ¬μ©ν΄λ³΄κΈ° (View Tagging) (0) 2021.03.05