투케이2K

69. (TWOK/ALGORITHM) [Ios] 패턴 - KVO (Key Value Observing) 패턴 설명 및 예제 - 프로퍼티의 상태 변경 반응 확인 본문

투케이2K 알고리즘

69. (TWOK/ALGORITHM) [Ios] 패턴 - KVO (Key Value Observing) 패턴 설명 및 예제 - 프로퍼티의 상태 변경 반응 확인

투케이2K 2022. 11. 20. 11:18

[환경 설정 및 설명]

언 어 : Ios

설 명 : 패턴 - KVO (Key Value Observing) 패턴 설명 및 예제 - 프로퍼티의 상태 변경 반응 확인

 

[설 명]

1. KVO 는 다른 객체의 변경사항 (특정 키의 값의 변화) 을 알려주는 코코아 프로그래밍 패턴 입니다


2. KVO 는 모델 객체의 어떤 값이 변경 되었을 경우 이를 UI 및 로직에 반영하기 위해서 컨트롤러는 모델 객체에 Observing 을 도입하여 딜리게이트에 특정 메시지를 보내 작업을 처리합니다


3. KVO 는 메소드나 다른 액션에서 나타나는 것이 아니라 프로퍼티의 상태에 반응합니다


4. KVO 사용 방법 및 이점 : 

  - Model 과 View 와 같이 분리된 파트 간의 변경사항을 전달하는데 유용함니다

  - NSObject 를 상속한 클래스에서만 KVO를 사용할 수 있습니다 (@objc)
 

[소스 코드]

    // MARK: - [KVO 형식 클래스 선언 실시]
    class User: NSObject {
        
        // [전역 변수 선언 실시]
        let name: String
        @objc dynamic var age: Int // [dynamic 반응 속성 위해 선언]
        
        
        // [클래스 생성자 초기화]
        init(name: String, age: Int) {
            self.name = name
            self.age = age
            
            print("")
            print("====================================")
            print("[User >> init() :: 클래스 생성자 초기화]")
            print("name :: \(self.name)")
            print("age :: \(self.age)")
            print("====================================")
            print("")
        }
    }
    
    
    
    
    
    
    // MARK: - [테스트 메인 함수 정의 실시]
    func testMain() {
        print("")
        print("====================================")
        print("[\(self.ACTIVITY_NAME) >> testMain() :: 테스트 함수 시작 실시]")
        print("====================================")
        print("")
        
        
        /*
         -------------------------------
         [요약 설명]
         -------------------------------
         1. KVO 는 다른 객체의 변경사항 (특정 키의 값의 변화) 을 알려주는 코코아 프로그래밍 패턴 입니다
         -------------------------------
         2. KVO 는 메소드나 다른 액션에서 나타나는 것이 아니라 프로퍼티의 상태에 반응합니다
         -------------------------------
         3. NSObject 를 상속한 클래스에서만 KVO 를 사용할 수 있습니다 (@objc)
         -------------------------------
         */
        
        
        // [로직 처리 수행]
        DispatchQueue.main.async {
            
            // [클래스 인스턴스 생성 실시]
            let user = User(name: "투케이", age: 29)
            
            
            // [반응 상태 감지를 위한 observe 등록]
            let observation = user.observe(\.age , options: [.old, .new]) { (object, change) in
                print("")
                print("====================================")
                print("[\(self.ACTIVITY_NAME) >> testMain() :: observation 데이터 변경 확인]")
                print("old name :: \(object.name)")
                print("old age :: \(String(describing: change.oldValue!))")
                print("new age :: \(String(describing: change.newValue!))")
                print("====================================")
                print("")
            }
            
            
            // [데이터 변경 수행 실시]
            user.age = 30
        }

    }
 
반응형
Comments