용어 | 설명 |
---|---|
Publisher | 데이터를 발행하는 주체. 예: Just , URLSession , 배열 등 |
Subscriber | 데이터를 받아 처리하는 주체. 예: sink , assign |
Operator | 데이터를 중간에 변형/필터링하는 도구. 예: map , filter , debounce 등 |
💡 Combine의 기본 흐름:
Publisher → Operator → Subscriber
import Combine
// 1. Publisher 생성
let numbers = [1, 2, 3, 4, 5].publisher
// 2. Subscriber를 통해 값 수신 및 출력
numbers
.map { $0 * 2 } // 값 변환 (Operator)
.sink { print($0) } // 출력 (Subscriber)
✅ 출력 결과:
2 4 6 8 10
Subscriber
는 Publisher
의 데이터를 수신하고 처리합니다..sink { }
: 가장 널리 쓰이는 구독 방식.assign(to:on:)
: 값을 특정 속성에 자동 바인딩let publisher = [10, 20, 30].publisher
publisher
.sink { value in
print("받은 값: \(value)")
}
Subject
는 데이터를 직접 발행할 수 있는 특별한 Publisher
send()
로 수동 발행 가능Subject 타입 | 특징 |
---|---|
PassthroughSubject | 과거 이벤트를 저장하지 않음. 새 구독자에게는 새 이벤트만 전달 |
CurrentValueSubject | 항상 최신값을 유지. 구독 시 최신값을 즉시 전달 |
import Combine
let subject = PassthroughSubject<String, Never>()
let subscriber = subject
.sink { value in
print("받은 값: \(value)")
}
subject.send("🚀 첫 번째 이벤트")
subject.send("🔥 두 번째 이벤트")
출력:
받은 값: 🚀 첫 번째 이벤트 받은 값: 🔥 두 번째 이벤트
import Combine
let subject = CurrentValueSubject<String, Never>("🎯 초기값")
subject.send("🧪 업데이트된 값")
let subscriber = subject
.sink { value in
print("받은 값: \(value)")
}
subject.send("✅ 최종값")
출력:
받은 값: 🧪 업데이트된 값 받은 값: ✅ 최종값
항목 | 설명 |
---|---|
sink {} | 가장 많이 사용하는 구독 메서드 |
PassthroughSubject | 상태를 저장하지 않고 단순 이벤트 전달용 |
CurrentValueSubject | 최신 상태를 저장하고 구독자에게 즉시 전달 |
Publisher | 값을 발행하는 데이터 소스 |
Subscriber | 발행된 값을 받아 처리하는 소비자 |
Operator | 중간에 데이터를 가공하거나 필터링하는 변환 도구 (map , filter 등) |
주제 | 핵심 내용 |
---|---|
Combine | Apple의 반응형 비동기 이벤트 처리 프레임워크 |
Publisher | 데이터를 발행하는 주체 |
Subscriber | 데이터를 구독하고 처리하는 객체 |
Operator | 데이터를 중간에서 변환/필터링 |
Subject (Passthrough) | 상태 저장 없이 이벤트만 전달 |
Subject (CurrentValue) | 최신 상태를 유지하고 즉시 전달 가능 |
.sink {} | 가장 널리 쓰이는 구독 메서드 |