-
Swift KVO ( Key Value Observing, Reactive Programming)Swift/Swift Language 2022. 4. 14. 00:17
// // ViewController.swift // KVO // // Created by Kyle Lee on 10/12/18. // Copyright © 2018 Kyle Lee. All rights reserved. // import UIKit class User: NSObject { // send notification (dynamic) @objc dynamic var name = String() @objc var age = 0 { willSet { willChangeValue(forKey: #keyPath(age))} didSet { didChangeValue(for: \User.age)} } } class ViewController: UIViewController { @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var ageLabel: UILabel! @IBOutlet weak var textLabel: UILabel! @IBOutlet weak var textField: UITextField! var nameObservationToken: NSKeyValueObservation? // var ageObservationToken: NSKeyValueObservation? var inputTextObservationToken: NSKeyValueObservation? // it is able to absorb notifications @objc let user = User() // make it observable string @objc dynamic var inputText: String? override func viewDidLoad() { super.viewDidLoad() // observe returns token // anything new call the block of code (starts with guard let ..) // == \ViewController.user.name nameObservationToken = observe(\.user.name, options: [.new]) { (strongSelf, change) in guard let updatedName = change.newValue else { return } strongSelf.nameLabel.text = updatedName } // ageObservationToken = observe(\.user.age, options: .new) { (strongSelf, change) in // guard let updatedAge = change.newValue else { return } // strongSelf.ageLabel.text = String(updatedAge) // } inputTextObservationToken = observe(\.inputText, options: .new, changeHandler: { (vc, change) in guard let updatedInputText = change.newValue as? String else { return } vc.textLabel.text = updatedInputText }) addObserver(self, forKeyPath: #keyPath(user.age), options: .new, context: nil) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) nameObservationToken?.invalidate() // ageObservationToken?.invalidate() inputTextObservationToken?.invalidate() } @IBAction func didTapUpdateName() { user.name = "kilo" } @IBAction func didTapUpdateAge() { user.age = 27 } @IBAction func textFieldTextDidChange() { inputText = textField.text } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if keyPath == #keyPath(user.age) { guard let updatedAge = change?[.newKey] as? Int else { return } ageLabel.text = String(updatedAge) } } }
출처: https://www.youtube.com/watch?v=_AWyXA1sPuc
'Swift > Swift Language' 카테고리의 다른 글
Swift Language ) Properties (0) 2022.01.17 Assertions & Preconditions (0) 2021.11.24 Swift Language ) Error Handling (0) 2021.11.23 Swift Language ) Advanced Operators (0) 2021.11.11 Structures And Classes (Swift) (0) 2021.11.01