세상을 더 편리하게
article thumbnail
728x90

0. Combine이란?

애플에서 만든 Rxswift 같은 느낌?

손쉽게 설명하면 API통신 이걸로해야 손쉽게 가능하다?

한 번쯤은 시간이 들더라도 직접 설명을 듣고 오는게 좋긴합니다.

 

Introducing Combine - WWDC19 - Videos - Apple Developer

Combine is a unified declarative framework for processing values over time. Learn how it can simplify asynchronous code like networking,...

developer.apple.com

 

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개를 추가로 받을게요~ 를 선택할 수 있습니다.

 

참조

https://zeddios.tistory.com/925

728x90

'Swift > Swift' 카테고리의 다른 글

[swift] Combine - Subject  (0) 2022.06.26
[swift] Combine - Subscriber - subscription  (0) 2022.06.26
profile

세상을 더 편리하게

@쵱니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!