ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.