사용자 지정 게시자와 구독자
직접 Combine 구성 요소를 만듭니다.
사용자 지정 게시자와 구독자은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
기본 제공 게시자를 넘어
Combine에는 많은 게시자가 기본으로 포함되어 있지만, 때로는 Combine이 아닌 API를 게시자로 감싸거나 정확한 백프레셔 제어로 값을 소비해야 합니다. 그러려면 게시자 및 구독자 프로토콜을 직접 구현해야 합니다.
게시자 프로토콜
게시자는 Output 및 Failure 유형을 선언하고 receive(subscriber:)를 구현합니다. 이 메서드에서 들어온 구독자에게 subscription을 전달합니다.
protocol Publisher {
associatedtype Output
associatedtype Failure: Error
func receive<S: Subscriber>(subscriber: S)
where S.Input == Output, S.Failure == Failure
}Subscription의 역할
구독자가 연결되면 게시자는 Subscription 객체를 생성합니다. subscription은 수요를 관리하고 값을 전달하는 연결 고리입니다. Subscription을 준수하며, 이는 Cancellable을 확장합니다.
사용자 지정 Subscription
subscription은 구독자를 저장하고 수요 요청에 응답하여 값을 내보냅니다.
final class CountSubscription<S: Subscriber>: Subscription
where S.Input == Int {
private var subscriber: S?
private var current = 0
init(subscriber: S) {
self.subscriber = subscriber
}
func request(_ demand: Subscribers.Demand) {
var remaining = demand
while remaining > 0 {
remaining -= 1
remaining += subscriber?.receive(current) ?? .none
current += 1
}
}
func cancel() {
subscriber = nil
}
}사용자 지정 게시자
게시자는 subscription을 생성하고 receive(subscription:)을 통해 구독자에게 전달하기만 합니다.
struct CountPublisher: Publisher {
typealias Output = Int
typealias Failure = Never
func receive<S: Subscriber>(subscriber: S)
where S.Input == Int, S.Failure == Never {
let subscription = CountSubscription(subscriber: subscriber)
subscriber.receive(subscription: subscription)
}
}수요 이해하기
백프레셔는 Combine의 흐름 제어입니다. 구독자는 특정 Demand를 요청하며, 게시자는 요청된 것보다 많은 값을 보내서는 안 됩니다. receive(_:)에서 수요를 반환하면 허용량이 늘어납니다.
구독자 프로토콜
사용자 지정 구독자는 세 가지 메서드를 구현합니다. 먼저 subscription을 받고, 다음으로 각 값을 받은 뒤, 마지막으로 완료를 받습니다.
protocol Subscriber {
associatedtype Input
associatedtype Failure: Error
func receive(subscription: Subscription)
func receive(_ input: Input) -> Subscribers.Demand
func receive(completion: Subscribers.Completion<Failure>)
}사용자 지정 구독자
여기서는 구독자가 처음에 값 두 개를 요청한 다음, 받는 각 값마다 하나를 더 요청하면서 값을 출력합니다.
final class PrintSubscriber: Subscriber {
typealias Input = Int
typealias Failure = Never
func receive(subscription: Subscription) {
subscription.request(.max(2))
}
func receive(_ input: Int) -> Subscribers.Demand {
print("Value:", input)
return .max(1)
}
func receive(completion: Subscribers.Completion<Never>) {
print("Done")
}
}델리게이트 API 감싸기
사용자 지정 게시자의 실용적인 용도는 델리게이트 또는 콜백 API를 Combine으로 연결하여 레거시 코드를 조합 가능하게 만드는 것입니다. 구독자를 저장하고 델리게이트 콜백을 receive(_:) 호출로 전달합니다.
가능하면 subject 사용하기
프로토콜을 직접 구현하는 일은 거의 필요하지 않습니다. 대부분의 연결 작업에서는 PassthroughSubject 또는 CurrentValueSubject가 훨씬 간단하며, send(_:)만 호출하면 됩니다.
let subject = PassthroughSubject<Int, Never>()
subject
.sink { print($0) }
.store(in: &cancellables)
subject.send(1)
subject.send(2)사용자 지정 구현이 필요한 경우
다음과 같은 경우에는 사용자 지정 게시자/구독자 구현을 선택하십시오:
- 세밀한 백프레셔 제어가 필요한 경우
- 복잡한 Combine 외부 소스를 효율적으로 감싸야 하는 경우
- 재사용 가능하고 유형 안전한 연산자가 필요한 경우
그 외에는 subject와 기본 제공 연산자가 적합합니다.
빠른 확인
사용자 지정 게시자에 대한 지식을 테스트해 보십시오.
요약
Combine의 핵심 프로토콜을 구현하는 방법을 학습했습니다:
- 게시자는 각 구독자에 대해 Subscription을 생성합니다
- subscription은 수요(백프레셔)를 따릅니다
- 구독자는 subscription, 값 및 완료를 받습니다
- 대부분의 연결 작업에는 subject를 우선 사용합니다
이러한 내부 작동 원리를 이해하면 Combine의 전체 동작이 더 명확해집니다.
자주 묻는 질문
“사용자 지정 게시자와 구독자” 강의는 무료인가요?
네 — “사용자 지정 게시자와 구독자” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“사용자 지정 게시자와 구독자”에서 뭘 배우나요?
직접 Combine 구성 요소를 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“사용자 지정 게시자와 구독자” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 스트림 변환과 결합
- 스케줄러와 스레딩
- 오류 처리 연산자
- 사용자 지정 게시자와 구독자