티스토리 뷰

Swift

Combine 뽀개기 2장: Subscriber

Esiwon 2023. 7. 26. 19:46

Subscriber

A protocol that declares a type that can receive input from a publisher.
게시자로부터 입력을 받을 수 있는 형식을 선언하는 프로토콜입니다.

Subscriber는 공식문서에도 쓰여있듯 프로토콜 Subscriber를 채택받은 타입은 Publisher로 부터 방출된 값을 받을 수 있는 녀셕이 된다. 코드로 보면,

class CustemSubscriber: Subscriber {


    typealias Input = String

    typealias Failure = Never

    func receive(subscription: Subscription) {
        print("구독 시작")
        subscription.request(.max(1))
    }

    func receive(_ input: String) -> Subscribers.Demand {
        print("\(input)")
        return .max(1)
    }

    func receive(completion: Subscribers.Completion<Never>) {
        print("작업 완료", completion)
    }
}

위 처럼 Subscriber 프로토콜을 체택하게 되면, 두 typealias와 3개의 receive 메서드를 구현해야 한다.

하나씩 정리해보면,

  • Input: 전달 받는 값의 타입이다.
  • Failure: 에러 타입에 해당. 에러를 받지 않는 경우 Never
  • receive(subscription: Subscription): PublisherSubscriber가 연결되면 호출되는 메서드,request를 통해 받을 수 있는 값의 수를 정해준다.
    • .unlimited : 제한 없음
    • .max(n) : 최대 n 개
    • .none : 요청을 받지 않겠다.
  • receive(_ input: String) -> Subscribers.Demand: 받은 input을 처리하는 로직및 추가로 요청을 받을 수를 리턴한다. (input이 들어올 때 마다 호출됨.)
  • receive(completion: Subscribers.Completion<Never>): 요청이 끝나면 호출되는 메서드
let publisher = ["사자", "호랑이", "곰", "코끼리"].publisher
publisher.subscribe(CustemSubscriber())
/*
구독 시작
사자
호랑이
곰
코끼리
작업 완료 finished
*/

위 같은 방법으로 Subscriber 타입을 만들어 Publisher 통해 방출된 값을 받아 처리할 수 있다....
근데 이거 언제 만들고 있어???

그렇다 때문에, 애플은 Publishersink이라는 메서드를 통해 위같이 Subscriber를 직접 만들지 않아도 되도록 구현해 놨다. 😅

'Swift' 카테고리의 다른 글

Combine 뽀개기 4장: Scheduler  (0) 2023.07.26
Combine 뽀개기 3장: Subject  (0) 2023.07.26
Combine 뽀개기 1장: Publisher  (0) 2023.07.26
[Swift] Swift Concurrency와 GCD  (1) 2022.12.14
[Swift] Race Condition과 Thread Safe  (0) 2022.12.12
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함