[번역] Using Key-Value Observing in Swift

1Consumption·2020년 3월 3일
3

Cocoa Design Patterns

목록 보기
1/2

본문의 내용은 Using Key-Value Observing in Swift을 번역한 내용입니다.
부족한 영어실력으로 번역하여 오역이 있을 수 있습니다.


Overview

Key-value observing 은 다른 오브젝트의 속성 변화를 오브젝트에게 알리기 위해 사용하는 Cocoa programming 패턴입니다. model과 view같이 논리적으로 분리된 부분 사이에서 변경사항을 전달하는데 유용합니다. 또한 NSObject를 상속받은 클래스에서만 key-value observing를 사용할 수 있습니다.

Annotate a Property for Key-Value Observing

@objc attributedynamic modifier를 모두 사용하여 key-value observing을 통해 관찰하기를 원하는 속성을 표시하십시오. 아래의 예시는 관찰될 수 있는 myDate 속성을 지닌 MyObjectToObserve class를 정의합니다.

class MyObjectToObserve: NSObject {
    @objc dynamic var myDate = NSDate(timeIntervalSince1970: 0) // 1970
    func updateDate() {
        myDate = myDate.addingTimeInterval(Double(2 << 30)) // Adds about 68 years.
    }
}

Define an Observer

observer 클래스의 인스턴스는 하나 이상의 속성에 대한 변경사항에 대한 정보를 관리합니다. observer를 만들 때, 관찰하려는 속성을 나타내는 key path와 함께 observe(_:options:changeHandler:) method를 호출하여 observation을 시작합니다. 아래의 예시에서 \.objectToObserve.myDate key path는 MyObjectToObserve의 myDate속성을 참조합니다.

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!)")
        }
    }
}

NSKeyValueObservedChange 인스턴스의 oldValue와 newValue 속성을 이용하여 관찰 중인 속성에 대해 변경된 사항을 볼 수 있습니다. 만약 속성이 어떻게 변경되었는지 알 필요가 없다면, options 매개변수를 생략하십시오. options 매개변수를 생략하면 new와 old 속성값이 저장되지 않으므로, oldValue와 newValue 속성은 nil이 됩니다.

Associate the Observer with the Property to Observe

객체를 observer의 이니셜라이저에 전달하여 관찰하려는 속성을 관찰자와 연결합니다.

let observed = MyObjectToObserve()
let observer = MyObserver(object: observed)

Respond to a Property Change

위에서 observed한 것 처럼 key-value observing을 사용하도록 설정된 객체는 그들의 observer들에게 속성 변경에대해 알립니다. 아래 예시는 updateDate 메소드 호출에 의해 myDate 속성이 변경됩니다. 이 메소드 호출은 observer의 change handler을 자동으로 트리거합니다.

observed.updateDate() // Triggers the observer's change handler.
// Prints "myDate changed from: 1970-01-01 00:00:00 +0000, updated to: 2038-01-19 03:14:08 +0000"

위의 예시는 날짜의 새 값과 이전 값을 모두 출력하여 속성 변경에 응답합니다.

profile
개발자가되고싶어요

0개의 댓글