일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- UIKit
- delegate
- Unicode
- init
- IOS
- Swift
- Foundation
- Git
- 디자인패턴
- String
- property
- Class
- interpace
- Method
- optional
- url
- tuist
- initalizer
- enum
- instance
- Terminal
- 이니셜라이저
- Protocol
- type
- 코딩테스트
- initializer
- Xcode
- 스위프트
- extension
- struct
Archives
- Today
- Total
아리의 iOS 탐구생활
[iOS/Swift] KVO(Key-value observing) 본문
반응형
KVO는 A객체에서 B객체의 프로퍼티가 변화됨을 감지할 수 있는 패턴이다. Notification이 주로 Controller와 다른 객체 사이의 관계를 다룬다면 KVO는 객체와 객체 사이의 관계를 다루는데 적합하다. 메소드나 다른 액션에서 나타나는 것이 아니라 프로퍼티의 상태에 반응하는 형태이다.
- 객체의 프로퍼티의 변경사항을 다른 객체에 알리기 위해 사용하는 코코아 프로그래밍 패턴
- Model과 View와 같이 논리적으로 분리된 파트간의 변경사항을 전달하는데 유용함
- NSObject를 상속한 클래스에서만 KVO를 사용할 수 있다.
장점
- 두 객체 사이의 정보를 맞춰주는 것이 쉽다
- New / old value를 쉽게 얻을 수 있다.
- KeyPath로 옵저빙하기 때문에 nested objects도 옵저빙이 가능하다.
단점
- NSobject를 상속받는 객체에서만 사용이 가능하다.
- dealloc될 때 옵저버를 지워줘야 한다.
- 많은 value를 감지할 때는 많은 조건문이 필요하다.
Observing을 위한 Setup
class Person: NSObject {
let name: String
@objc dynamic var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
- age가 변경하는 걸 다른 객체에게 알리고 싶다면 위 예제처럼 NSObject 상속을 받아야한다.
NSObject를 상속한 클래스에서만 KVO를 사용할 수 있기 때문이다.
상속을 해야하므로 class에서만 사용가능하다. - observe하려는 프로퍼티에 @objc attribute와 dynamic modifier를 추가해야한다.
Observer 정의
KeyPath를 사용하여 프로퍼티 KeyPath에 observer를 추가할 수 있다.
- 관찰자 클래스의 인스턴스는 하나 이상의 속성에 대한 변경사항에 대한 정보를 관리한다.
- 관찰자를 만들 때 관찰하려는 속성을 참조하는 키 경로로 메서드를 호출하여 관찰을 시작한다.
var person = Person(name: "ari", age: 20)
person.observe(\.age , options: [.old, .new]) { (object, change) in
print("갑자기 \(object.name)의 나이(\(change.oldValue!))가 \(change.newValue!)살이 되어버렸다...")
}
person.age = 24 // 갑자기 ari의 나이(20)가 24살이 되어버렸다...
person.age = 27 //갑자기 ari의 나이(24)가 27살이 되어버렸다...
프로퍼티 옵저버와 다른점이 뭘까?
- 프로퍼티 옵저버는 타입 정의 내부에 위치
KVO는 타입 정의 외부에서 observer를 추가할 때 사용
Reference
반응형
'Swift > iOS' 카테고리의 다른 글
[iOS/UIKit] Alert 알림창을 만들어보자 (0) | 2021.10.21 |
---|---|
[iOS/Swift] MVC (Model-View-Controller) (0) | 2021.10.20 |
[iOS/Swift] Notification, NotificationCenter (0) | 2021.10.20 |
[iOS] Timer를 간단히 사용해보기. (0) | 2021.09.30 |
[iOS] local에 있는 오디오파일 재생하는 방법 (0) | 2021.09.28 |
Comments