ObservableObject, Publisher, Subscriber, @Published
ObservableObject Protocol은 Combine Framework에서 제공하는 Protocol 중 하나이다. Combine Framework는 나중에 제대로 학습할 건데, 간단하게 알아보자. Combine Framework는 공식 문서에서 다음과 같이 설명한다. 'Customize handling of asynchronous events by combining event-processing operators. -> 이벤트 처리 연산자를 결합하여, 비동기 이벤트를 다루는 것을 커스텀화한다' 비동기 이벤트는, 컴퓨터 내에서 데이터를 주고받고 할 때, 데이터의 전송이 불연속, 불규칙적이기 때문에 발생하는 시간적 지연을 정확히 예측할 수 없는 상황을 의미한다. Combine Framework에서는 이런 상황을 다룰 수 있는 능력이 있는 기능들을 결합해서, 비동기 이벤트를 해결하는 역할을 한다.
ObservableObject Protocol을 공식 문서에서는 다음과 같이 설명한다. 'A type of object with a publisher that emits before the object has changed. -> 개체가 변경되기 전에 내보내는 Publisher가 있는 개체의 타입이다.' Publisher는 뭘까?
Publisher Protocol도 Combine Framework에서 제공하는 Protocol 중 하나이고, 공식 문서에서는 다음과 같이 설명한다.
'Declares that a type can transmit a sequence of values over time. -> 타입이 시간 경과에 따라 일련의 값을 전송할 수 있음을 선언합니다.' Publisher는 자신을 Subscribe한 Subscriber에게 값을 내보내는 Protocol이다. 직역해서 이해하고자 하면, Publisher는 게시자고 Subscriber는 구독자다. 게시자가 구독자에게 값을 내보내는 것이다. 어떤 값을 내보내고 Subscriber는 정확하게 뭘까?
하나의 앱은 여러 View이나 파일들로 구성되어있다. View들 사이에 데이터, 즉 값을 주고 받고 하는 게 자동으로 되는 게 아니라, 그렇게 되게끔 해줘야한다. 예를 들어, JSON 파일의 데이터들을 A파일에서 가져오게끔 코드를 작성하고, 이 A파일에서 다듬어놓은 데이터나 값을 BView로 보내고 싶을 때가 있다. 또 A파일에서 다듬어놓은 데이터가 시간에 따라 변경될 수도 있고, 외부적인 요인에 의해 변경될 수도 있다. 데이터나 값이 변하면 변하는 것에 맞게끔 B에도 반영되어 보내고자 할 때 Publisher가 사용된다. Publisher가 자신을 Subscirbe한 Subscriber에게 값을 내보낸다고 할 때 값이 이런 값들이다. Publisher는 Subscriber가 요청 했을 때, 데이터를 제공해준다.
Subscriber Protocol도 Combine Framework에서 제공하는 Protocol 중 하나이고, 공식 문서에서는 다음과 같이 설명한다. 'A protocol that declares a type that can receive input from a publisher. -> Publisher로부터 입력을 받을 수 있는 타입을 선언하는 프로토콜이다.' , 'Subscriber는 Publisher에게 데이터를 요청하고, Publisher가 제공한 데이터를 처리해야한다.
ObservableObject Protocol 공식 문서의 설명으로 돌아가보자. 'A type of object with a publisher that emits before the object has changed. -> 개체가 변경되기 전에 내보내는 Publisher가 있는 개체의 타입이다.' ObservableObject Protocol을 준수하는 클래스의 인스턴스를 관찰하고 있다가, @Published Property Wrapper가 붙은 값이 변경 되기 전에, 변경된, 즉 이전 값을 방출해버리는 Publisher가 있는 타입이다.
@Published는 공식 문서에서 다음과 같이 설명한다. 'A type that publishes a property marked with an attribute. -> 특성으로 표시된 속성을 게시하는 형식입니다.' @Published 특성을 사용하여 속성을 게시하면 이 형식의 Publisher가 만들어진다. $ 연산자를 통해 Publisher에 접근할 수 있다.
class SomeClass: ObservableObject {
@Published var anyDouble: Double
}