cozzin
코찐 기술 블로그
cozzin
전체 방문자
오늘
어제
  • 분류 전체보기
    • Kotlin
    • 백엔드
    • iOS
      • Swift
      • SwiftUI
      • Combine
      • Architecture
    • 개발환경
    • 세미나
    • 생각정리
    • 스터디
    • CS
      • Refactoring
      • OS

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • LinkedIn
  • 강의

공지사항

인기 글

태그

  • os
  • Ribs
  • 운영체제
  • 워닝제거
  • ios
  • darkmode
  • XCode
  • WWDC21
  • CS
  • Warning
  • multicast
  • 컴퓨터공학
  • slide-over
  • 디자인패턴
  • WWDC
  • SwiftUI
  • 테스트
  • Swift
  • 리팩토링
  • Combine

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
cozzin

코찐 기술 블로그

[Combine 책 정리] Chapter 12: Key-Value Observing
iOS/Combine

[Combine 책 정리] Chapter 12: Key-Value Observing

2021. 1. 27. 16:25
반응형

안녕하세요 코찐입니다.

아래의 자료를 따라서 공부하고 있습니다.

https://www.raywenderlich.com/books/combine-asynchronous-programming-with-swift/v2.0

 

KVO

그 유명한 KVO 입니다.

OperationQueue의 operation 개수가 변경되면 sink에서 이벤트를 받아볼 수 있습니다.

let queue = OperationQueue()

let subscription = queue.publisher(for: \.operationCount)
    .sink {
        print("Outstanding operations in queue: \($0)")
    }

 

커스텀으로 만들려면?

1. NSObject 상속

2. @objc dynamic 키워드

 

KVO가 Objc를 통해 지원되기 때문에 NSObject와 @objc dynamic 를 통해서 사용 가능합니다.

 

class TestObject: NSObject {
    @objc dynamic var integerProperty: Int = 0
}

let obj = TestObject()

let subscription = obj.publisher(for: \.integerProperty)
    .sink {
        print("integerProperty changes to \($0)")
    }

obj.integerProperty = 100
obj.integerProperty = 200
integerProperty changes to 0
integerProperty changes to 100
integerProperty changes to 200

 

 

Observation Options

구독할 때 옵션을 줄 수 있습니다.

developer.apple.com/documentation/foundation/nskeyvalueobservingoptions

 

Apple Developer Documentation

 

developer.apple.com

1. .inital : 초기 값을 방출.
2. .prior : 변화가 발생했을 때 이전 값과 새로운 값을 방출.

 

앞의 예제에서 options: [] 로 추가하면 초기값 안받습니다.

KVO가 @objc 키워드가 붙어서 optional이 안되는데, 초기값을 받기 싫은 경우에 이렇게 사용하면 됩니다.

유용하게 쓸 수 있을 것 같습니다.

let subscription = obj.publisher(for: \.integerProperty, options: [])
integerProperty changes to 100
integerProperty changes to 200

 

.prior는 이전값과 새로운값을 방출하는데

이걸 도대체 언제 쓸지는 의문입니다...

let subscription = obj.publisher(for: \.integerProperty, options: [.prior])
integerProperty changes to 0
integerProperty changes to 100
integerProperty changes to 100
integerProperty changes to 200

 

ObservableObject

이거는 SwiftUI 예제에서 접했었던 것인데, @Published 가 걸려있는 프로퍼티가 변경되는것을 감지할 수 있습니다.

어떤 프로퍼티가 변경되었는지는 구분 못합니다.

SwiftUI 처럼 ViewModel이 변경되면 View를 갱신해야할 때 사용할 수 있을 것 같습니다.

class MonitorObject: ObservableObject {
    @Published var someProperty = false
    @Published var someOtherProperty = ""
}

let object = MonitorObject()
let subscription = object.objectWillChange.sink {
    print("object will change")
}

object.someProperty = true
object.someOtherProperty = "Hello world"
object will change
object will change

 

 

 

반응형
저작자표시 (새창열림)

'iOS > Combine' 카테고리의 다른 글

[Combine] Chapter 16: Error Handling  (0) 2021.02.01
[Combine 책 정리] Chapter 13: Resource Management  (0) 2021.01.27
[Combine 책 정리] Chapter 11: Timers  (0) 2021.01.27
[Combine 책 정리] Chapter 10: Debugging  (0) 2021.01.27
[Combine 책 정리] Chapter 9: Networking  (0) 2021.01.27
    'iOS/Combine' 카테고리의 다른 글
    • [Combine] Chapter 16: Error Handling
    • [Combine 책 정리] Chapter 13: Resource Management
    • [Combine 책 정리] Chapter 11: Timers
    • [Combine 책 정리] Chapter 10: Debugging
    cozzin
    cozzin
    Software Engineer

    티스토리툴바