Skip to main content

Command Palette

Search for a command to run...

[iOS] KVO 구현하기

Published
•2 min read•View as Markdown
[iOS] KVO 구현하기
R

Hi there this is red🔴

🗝 KVO란?

KVO는 Key-Value observing 이다. 다른 오브젝트의 프로퍼티 속성이 변경되었을 때, 오브젝트에서 변경사항을 알 수 있게 해주는 것 이다. KVO는 NSObject 를 상속받은 클래스에서 사용할 수 있다.

오브젝트끼리의 응집력(끈끈하게 묶어줌)이 좋기 때문에, 항상 같이 다녀야 하고 코드의 재활용성이 떨어진다.

👊🏻 KVO 사용법

KVO 를 swift 코드에 적용해 보자. 📦 택배 클래스를 만들고, 택배의 배송정보가 업데이트 되면 자동으로 받아서 볼 수 있도록 하는 코드를 만들어 보자.

트랙킹할 클래스 지정

먼저 트랙킹할 (정보를 가져올) 클래스를 지정한다.

그 클래스를 아래와 같이 설정해 준다.

class Shipping: NSObject {
  @objc dynamic var teakbea: String = "준비중..."
}

KVO 라는 기능 자체가 NSObject 안에 들어있기 때문에 NSObject 를 상속 받아야 한다. 트랙킹할 변수에 @objc dynamic 을 붙여준다. (dynamic 키워드는 objec-C 에서 사용되는 키워드 중에 하나이다.)

옵저버 생성

그럼이제 변수가 변경 되었을 때 실행할 부분을 만들어주자. 인스턴스를 생성하고 인스턴스의 observe 를 붙인다.

var shipping = Shipping()

shipping.observe(\.teakbea, options: [.old, .new]) { object, change in
    guard let old = change.oldValue else { return }
    guard let new = change.newValue else { return }
    print("이전값: \(old) 지금값: \(new)") }

observe 란 메서드의 3개의 프로퍼티가 필요하다.

  • key Path
  • options
  • changeHandler

KeyPath

/. 로 시작하고 . 뒤에 트랙킹 하는 프로퍼티 값을 설정해 준다.

options 의 종류

options 부분에는 무슨 값을 가져올 것인지를 넣어줄 수 있다.

old : 이전값 new : 현제값 initial : 초기화 시에도 옵져버 핸들러를 호출할 것이냐? prior : 이전의 상태와 지금의 상태를 다 주는 옵션

changeHandler

클로저 타입이다.

{ (object, change) in 구현부 }

첫번째 파라미터인 오브젝트는 말그대로 우리가 추적하고 있는 클래스 인스턴스를 의미한다. object.name 이런 식으로 값을 가져올 수 있다.

두번째 파라미터인 체인지는 변경된 값이 들어 간다. .oldvalue .newvlaue 등으로 접근이 가능하다.

KVO 옵져버를 생성해 준 시점부터 인스턴스 안의 프로퍼티 값이 변경되면 changeHandle 부분의 함수가 구현된다.

class Shipping: NSObject {
  @objc dynamic var teakbea: String = "준비중..."
}

var shipping = Shipping()

shipping.observe(\.teakbea, options: [.old, .new]) { object, change in
    guard let old = change.oldValue else { return }
    guard let new = change.newValue else { return }
    print("이전값: \(old) 지금값: \(new)") }

shipping.teakbea = "배송이 시작되었어요"
shipping.teakbea = "배송중 입니다."
shipping.teakbea = "배송이 완료되었습니다."

//이전값: 준비중... 지금값: 배송이 시작되었어요
//이전값: 배송이 시작되었어요 지금값: 배송중 입니다.
//이전값: 배송중 입니다. 지금값: 배송이 완료되었습니다.

More from this blog

[swift] String.Index 는 무엇일까?

🧐 String.Index 타입이란? 스위프트에서는 String 타입의 인덱스를 나타내기 위해서 Int 를 사용하지 않고 String.index 라는 특수한 타입을 사용한다. 그럼 이 값을 인트로 변환할 수는 없는 건가? 할 수 가 없다. 에러가 뜬다.😭 우선 스트링은 heap 에 저장 된다. (WWDC에서 말한 내용이니 이것은 맞다.) 🚨여기서 부터 뇌피셜 주의 String.Index 의 공식 문서를 보면 이 타입이 인스턴스로 var ...

Mar 18, 20222 min read
[swift] String.Index 는 무엇일까?

[swift] Substring는 왜 있는 걸까?

🗒 Substring 이란? String 타입을 가지고 메서드로 변형을 하게 되면 이상하게 return 타입이 String 이 아니고 Substring 이다. 애플 공식문서가 말하길 Substring 타입은 String 타입과 거의 동일한 메서드를 가지고 있기 때문에 String처럼 사용할 수 있는 타입이라고 한다. @frozen struct Substring 🧐 Substring이 존재하는 이유 위의 말에 따르면 String이나 Sub...

Mar 18, 20221 min read
[swift] Substring는 왜 있는 걸까?

[iOS] delegate 구현하기

✍🏻 delegate 패턴 이란? delegate 의 뜻은 위임이다. 나의 권한을 다른 사람에게 위임하다. 원래는 내가 사용하도록 가지고 있는 권한인데 다른 사람에게 내 권한을 사용할 수 있게 위임한다. 라는 의미로 사용 된다. delegate pattern 의 의미도 같다. 원래 나의 오브젝트가 처리할 권한을 가지고 있어서 처리해야 할 일을 다른 오브젝트에게 권한을 넘겨주어서 다른 오브젝트에서 처리하도록 해주는 패턴이다. ✍�...

Mar 17, 20224 min read
[iOS] delegate 구현하기

[iOS] Notification Center 구현하기

😁 노티피케이션 센터란? 노티피케이션 센터란, 등록된 관찰자에게 알려줄 수 있도록 하는 알림 메커니즘이다. KVO 나 delegate 가 1 대 1 통신을 하는 것에 가깝다면 노티피케이션 센터는 여러곳에서 온 정보를 한 곳에서 모아서 다시 여러 곳으로 뿌려주는 것에 가깝다. 그래서 많은 사람들이 방송국에 노티피케이션 센터를 비유한다. 💻 노티피케이션 센터 구현해보기 NotificationCenter 공식 문서 노티피케이션 센터라는 이미...

Mar 17, 20224 min read
[iOS] Notification Center 구현하기
R

Red Bite Apple

7 posts

🔴🔥😚 여기에 일단 나에 대한 소개를 써보자 이건 어디에 계시 되는 것일까?