0. Combine이란?
애플에서 만든 Rxswift 같은 느낌?
손쉽게 설명하면 API통신 이걸로해야 손쉽게 가능하다?
한 번쯤은 시간이 들더라도 직접 설명을 듣고 오는게 좋긴합니다.
1. Combine 프로토콜
Combine은 프레임워크이고 크게 5가지의 프로토콜이 있지만 이번에는 크게 2가지만 봅시다.
- Publisher
- Subscriber
2. Publisher
Publisher 뭔가 데이터를 발행하는 듯한 느낌인데요. 맞습니다. 말 그대로 발행자입니다.
데이터를 보내주는 역할을 합니다.
그럼 어디로 보내야 할까요?
3. Subscriber
구독자? 맞습니다. Publisher가 보낸 데이터를 Subscriber가 받고 처리합니다.
4. 예시
백문이불여일견 한번 예시를 봅시다.
let publisher = Just("Toby")
Just는 Publisher 프로토콜을 따르고 있는 구조체 입니다.
Subscriber를 만드는 방법은 다양합니다. 가장 기초적인 sink에 대해서 알아봅시다.
let publisher = Just("Toby")
let subscriber = publisher.sink { value in
print(value)
}
위에 코드를 실행하면 Toby가 출력된다.
sink에는 사실 2가지 옵션이 있다.
let publisher = Just("Toby")
let subscriber = publisher.sink(
receiveCompletion: { completion in
print(completion)
},
receiveValue: { value in
print(value)
}
)
간단하게 예를 들면 위와 같습니다.
위와 같이 recevieCompetion 클로저가 receiveValue 클로져 끝난 후에 작동 됨을 알 수 있습니다.
5. 예시 2
[4]처럼 sink를 통해서 손쉽게 Subscriber를 생성할 수 있습니다. 하지만 이번엔 전통적으로 객체를 직접 만들어서 구현시켜 봅시다.
let publisher = Just("Toby")
let subscriber = CustomSubscriber()
publisher.subscribe(subscriber)
순서대로 1️⃣2️⃣3️⃣ 실행됨을 알 수 있습니다. 천천히 뜯어봅시다.
애플 공식 설명에서 (링크 6:50) 보면 다음과 같습니다.
약간 동사무서에서 어떤 서류를 발급받는다고 생각해봅시다.
Combine | 동사무소 |
subscribe(Subscriber) | To 공무원에게, 저 00서류 발급받으려 왔는데요! |
receive(subscription: ) | To 민원인에게, 그럼 이 서류 작성해서 저 주세요! |
request(_: Demand) | 작성 후에 공무원에게 다시 제출 |
receive(_ : Input) | 00 서류 건네줌 |
receive(_ : Input) | 00 서류 건네줌 1개가 아니라면 여러번 호출 |
receive(completion: ) | From 공무원 To 민원이에게, 서류 다 발급되었습니다. 감사합니다! |
꽤 그럴듯한 흐름입니다. 그럼 한번 세세히 코드를 뜯어봅시다.
subscription.request(.unlimited)는 동사무소 버전으로 서류 몇 개 필요하신가요? 와 비슷합니다.
구독을 어떻게 하는 건지를 결정하는 함수입니다.
그럼 2️⃣에 return .none은 무엇인가요?
데이터를 N개 수신하기로 했는데 받다보니 더 필요한 경우도 있습니다. 그럴 경우 구독의 형태를 바꿔야 합니다.
func receive(_ input: String) -> Subscribers.Demand
에서 반환값으로 Demand 즉 지금 받기로한 데이터에서 N개를 추가로 받을게요~ 를 선택할 수 있습니다.
참조
'Swift > Swift' 카테고리의 다른 글
[swift] Combine - Subject (0) | 2022.06.26 |
---|---|
[swift] Combine - Subscriber - subscription (0) | 2022.06.26 |