다들 콤바인을 끌어봤는가?
전원일기 OST가 나올법한 콤바인....
하지만 우리가 알아볼건 iOS Combine 깔깔깔
Combine 따따디씨 2019에서 처음 소개된 개념이다.
나 같은 초보자의 설명보다는 애플의 발표가 100번 나으니 애플 발표를 먼저보고
이건 참고용으로만~!
Introducing Combine
Introducing Combine
컴바인에는 크게 3가지가 있다.
Publisher
- Value와 Error를 만드는 역할
Operator
- 이건 밑에 설명! 개봉박두!
Subscriber
- 수신된 Value와 Error를 처리하는 역할
이 3개를 천천히 알아가보자.
Publisher
Value 와 Error 를 만드는 역할이다.
Value Type(Struct)로 구성되어 있다.
Struct로 구성되는 Value 타입이니 protocol으로 구성되어 있다.
associatedtype으로 Output
과 Failure
로 구성되어 있다.
subscribe()
를 통해서 Subscriber를 Publisher에 붙이는 역할하는 메소드가 있다.
예시로 살펴보자
NotificationCenter에서 Publisher를 보자
Output으로 Notification을 출력하고, Failure로 Never를 출력한다.
Subscriber
Value, Failure, Completion을 받는다.
Reference Type 이다.
receive가 총 3가지가 있다.
receive(subscription: Subscription)
사실 이게 가장 이해 안 갔다. 뭐지 이 메소드는?
아하! subscriber에게 Publisher에게 잘 붙었다고 알려주는 함수구나!
*여기서 subscriber & subscription 명칭을 헷갈리지 말자.
receive(_ input: Input)
Publisher로 부터 만들어진 값을 subscriber가 값을 받는 함수
receive(completion:)
publisher가 subscriber에게 값 전달이 끝났다고 알려주는 함수이다.
정상 종료, 비정상종료 상관 없이!
Subscriber의 예시를 보자. Failure로 Publisher와 같이 Never를 채택할 수 있다.
흠 여기까지 보면 아직 감에 안잡힌다. 그래서 어떻게 작동되는지 보자!
Publisher와 Subscriber 작동 원리
Publisher의
subscribe(_:)
메소드를 이용해서 Subscriber를 연결할 수 있다.만약 성공적으로 연결된다면 Subscriber의
receive(subscription:)
이 작동한다.Subscription
을 통해서 value를 요구하거나 cancel 할 수 있다.Publisher에 value를 요구하면 Publisher는 Subscriber의
receive(_:)
호출을 통해 값을 전달한다.만약 출력이 끝나면 Publisher는 Subscriber의
receive(completion:)
을 호출한다.
애플 WWDC에서는 위 그림 같이 설명하고 있다.
오해할만한게 화살표 시작 부분은 호출한 Object 기준이다.
자 그럼 예시로 가보자.
엥? 정상적으로 Publisher도 만들어졌고 Subscriber도 만들어졌는데 왜 안될까?
정답은 Publisher의 Output != Subscriber의 Input
이기 때문이다.
아 그럼 저걸 일일이 맞춰주는거 힘들겠는데? 에서 나온 개념이 바론 Operator이다.
Operator
Publisher를 채택하고 있다.
Publisher -> Subscriber 에게 보내는 것을 Downstream
Subscriber -> Publisher 로 가는 것을 Upstream
Value Type
Publisher: NotificationCenter에서 publisher를 통해 Notification을 출력한다.
Operator: 그걸 map 메소드를 통해서 map -> Int 로 변환해준다.
Subscriber: assign 을 통해서 merlin 의 grade 에 저장한다.
여기서 map 메소드 이거 바로 Operator 이다.
Operator에는 어떤게 있을까?
우리가 생각하기에 Array 처럼 다룬다고 생각하면 좋다.
Array에 map 이 있듯이 Operator로 map이 있다.
compactMap, filter 도 있다.
이렇게 설명해도 이해갈 듯 안 갈듯 한 게 당연!
그래서 이어서 2편 제작하겠다!