안녕하세요 Niro 🚗 입니다!
앞서 Combine 에 대해 소개와 함께 Publisher 에 대해 알아보았습니다.
안읽고 오신분이 있으시다면?
를 읽고 와주시면 좋을거 같습니다!
자 이번엔 두번째 편으로 Subscribers 에 대해 설명하겠습니다!
이름 그대로 Publisher 가 유한한 경우 완료됨과 함께 값을 받는 것입니다.
Subscriber 는 일반적으로 값을 받게되면 State 를 실행하고 변경하기 때문에 Swift 에서는 참조 유형을 사용하게 됩니다
즉, Class 를 의미한다는 것이죠!
그럼 어떤 구조를 갖고 있는지 볼까요?
Protocol 로 선언이 되어 있고 Input
과 Failure
라는 두가지 유형이 존재합니다.
Publisher 와 마찬가지로 Subscribers 가 Failure
를 수신할 수 없는 경우 Never
를 사용할 수도 있습니다.
Subscriber 는 3가지 주요한 메서드를 갖고 있고 구독을 할 수 있는 역할을 합니다.
첫번째, 구독은 Subscribers 가 Publisher 에서 Subscribers 의 데이터 흐름을 제어하는 방법입니다.
두번째, Input 을 받을 수도 있습니다.
세번째, 연결된 Publisher 가 유한한 경우 Completion 또는 Failure 인 Completion 을 받을 수 있습니다.
이렇게 보기만 해서는 이해가 잘 안가니까.. 어떻게 활용하는지 예시를 봅시다!
Assign
은 Class 이며 클래스 인스턴스, 개체 인스턴스 및 해당 개체로의 type safe key path 로 초기화 됩니다.
type safe key path 란?
Swift 프로그래밍 언어의 특징 중 하나로 속성 또는 서브스크립트에 대한 경로를 나타내고 해당 경로가 타입 안전하다는 것을 보장합니다.
즉, Type safe keypath 를 사용하면 속성값을 가져오거나 설정할 때 컴파일러가 타입 불일치 오류를 방지하고 안전하게 처리할 수있다는 것입니다.
또한 입력을 받으면 해당 객체의 해당 속성에 Input 을 할당하게 됩니다.
Swift 에서는 속성 값만 작성할 때 오류를 처리할 방법이 없기 때문에 실패 유형인 Assign 을 Never
로 설정하게 됩니다.
Subscriber 는 Publisher 에게 구독 요청을 보내게 됩니다.
요청을 받게 되면 Publisher 는 Subscriber 에게 구독 정보를 전송하고, 해당 Subscriber 는 Publisher 로 부터 특정 개수의 값 또는 무제한의 값을 요청하는데 사용하게 됩니다.
그 시점에서, Publisher 는 N 개의 값 또는 그보다 적은 값을 Subscriber 에게 전송할 수 있습니다. Publisher가 유한한 경우, 결국 완료 또는 오류를 보낼 것입니다.
다시 말해, subscription 하나, 0이거나 여러개의 값, 단일 Completion 이 있습니다.
원래 우리가 만들고자 했던 App 에 대해 다시 생각해봅시다.
Wizard 라는 Model Object 가 있고 해당 마법사가 몇학년에 속해있는지가 관심사 입니다!
코드를 보게 되면 5학년인 Merlin 이 보입니다.
여기서 우리가 원하는 동작은 학생들이 졸업에 대한 알림을 수신하는 것과 학생들이 졸업하면 model Object 의 값을 업데이트 하는 것입니다!
merlin 졸업에 대한 NotificationCenter 의 Pulisher 를 통해 gradutionPublisher 를 만들어줍니다.
Publisher 를 만들었으니 구독을 해주어야겠죠?
Assign Subscriber 를 생성해주고 Merlin 의 grade
속성에 새로운 값을 입력하도록 합니다.
Publisher 와 Subscriber 를 만들었으니 subscribe 메서드를 통해 연결을 시켜줍니다.
역시.. 코드는 오류가 안나고 한번에 실행되는게 이상하죠..?
오류 내용을 보게되니 유형이 일치하지 않아 오류가 발생한 것으로 보입니다.
NotificationCenter 의 Publisher 에서 Output 은 Notification 을 갖고 있습니다.
하지만 구독 정보를 받는 Subscriber 의 Input 은 Merlin 객체의 grade 속성에 입력하도록 구성되어있기 때문에 Assign 에는 정수가 필요합니다.
즉, 우리에게 필요한 것은 Notification 과 Int 간 변환을 해주어야한다는 것입니다.
그것이 바로! Operators 라는 것이지만.. 내용이 워낙 길기 때문에 다음 글에서 다룰 수 있도록 하겠습니다!
우리는 오늘 Subscriber 에 대해 알아보았습니다.
Publisher 를 구독하고 생성하는 값을 처리하고 필요한 작업을 수행하는 역할을 갖고 있습니다.
비동적인 데이터 흐름을 효과적으로 관리를 할 수 있도록 도와줄텐데.. 아직 잘 와닫지는 않네요..
아쉽지만 다음에 Operator 를 살펴보고 Subscriber 에 대해 더 알아봐야 할거 같습니다!
다음 글도 기다려주시고 긴 글 읽어 주셔서 감사합니다!