이번 포스팅에선 오퍼레이터가 뭔지 알아볼게요!

메를린이라는 학생이 졸업할 때 모델의 값을 변화시키고 싶습니다.
그래서 각각의 퍼블리셔와 섭스크라이버를 만들고
퍼블리셔에게 섭스크라이버를 등록했습니다.
하지만 위의 예시는 컴파일 되지 않는데요!
왜냐면 퍼블리셔와 섭스크라이버는 짝짜꿍이기 때문에 타입이 일치해야 하는데!
그렇지 않아서 그렇습니다.

노티피케이션 센터는 Notification을 만드는데, 섭스크라이버는 Int 타입(grade)입니다.
그래서 두 사이를 변환시켜줄 무언가가 있어야 합니다.
그때 필요한 것이 Operator 입니다.

사실 오퍼레이터는 퍼블리셔라고 할 수 있는데요!
왜냐하면 Publisher
프로토콜을 채택하고 있기 때문입니다.
역시나 선언형으로 사용할 수 있고, value 타입입니다.
저는 오퍼레이터를 퍼블리셔를 변화시키는 모양틀같은 것이라고 이해했습니다.
업스트림이라고 불리는 퍼블리셔 친구로부터 온 값을 바꾸거나, 추가하거나, 없애거나 하는 행위를 하고
그 결과를 다운스트림이라고 불리는 섭스크라이버로 보냅니다.
정리하자면 다음과 같습니다.
Operator:
- value를 변화시키는 행동을 묘사함
- 값타입이다.
- Publisher(업스트림)을 구독한다.
- Subscriber(다운스트림)에게 결과를 보낸다.

위의 방법은 컴파일이 안된다고 했는데 Map을 사용해서 Map 클로저 내부에서 Int 타입으로 return 해줍니다.
그러면 이제 gradeSubscriber를 연결할 수 있게 됩니다.
이 방식보다 좀 더 fluent~한 방식으로 사용할 수 있는데요

퍼블리셔의 익스텐션에 다음과 같이 추가가 되어있습니다.
따라서 이 메서드를 모든 퍼블리셔에서 사용할 수 있습니다.
map function은 upstream을 제외하고 Map을 초기화 하는 모든 인수를 받고 있습니다.
하지만 퍼블리셔 익스텐션에서 self를 사용할 수 있기 때문에 문제가 없죠!

이렇게 쉽게 사용할 수 있습니다.
Notification을 받으면 클로저를 사용하여 매핑한 다음 메를린의 grade 속성에 할당합니다.
flow를 쉽게 step-by-step으로 이해하기 쉬운 syntax죠?!
WWDC 영상에서
Declarative Operator API 라고 불리는 여러 오퍼레이터 친구들을 많이 가지고 있다고 영상에서 자랑을 하는군뇽

Map 뿐만 아니라 Filter, Reduce 와 같이 모양틀 역할을 하는 친구들
List에 대한 연산
Error를 다른 값으로 바꾸는 에러 처리
쓰레드나 큐의 이동이 필요한 작업
루프나, dispatch queue, 타이머등을 포함한 스케줄링 및 시간 작업
와 같은 엄청 많은 오퍼레이터가 있는데요!
https://developer.apple.com/documentation/combine/publisher/map(_:)-99evh
Apple Developer Documentation
developer.apple.com
공식문서만한게 없죠!? 하나씩 살펴보면서 필요한 오퍼레이터를 찾아쓰면 좋을 것 같습니다.ㅎ
To be continue...🌱
'Combine' 카테고리의 다른 글
Combine | Scheduler (0) | 2022.06.10 |
---|---|
Combine | Publisher and Subscriber (0) | 2022.05.24 |
Combine | Overview (0) | 2022.05.09 |