Swift Combine 완전 정복

Ios_Roy·2025년 8월 1일
0

TIL

목록 보기
16/25
post-thumbnail

📌 Combine 프레임워크란?

  • Combine은 Apple에서 제공하는 반응형 프로그래밍(reactive programming) 프레임워크입니다.
  • 데이터를 비동기적으로 처리하고, 이벤트 흐름을 선언적으로 조작할 수 있습니다.

🔑 핵심 개념

용어설명
Publisher데이터를 발행하는 주체. 예: Just, URLSession, 배열 등
Subscriber데이터를 받아 처리하는 주체. 예: sink, assign
Operator데이터를 중간에 변형/필터링하는 도구. 예: map, filter, debounce

💡 Combine의 기본 흐름:
Publisher → Operator → Subscriber


✅ Combine 기본 예제

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 (구독자)

개념 요약

  • SubscriberPublisher의 데이터를 수신하고 처리합니다.
  • 대표 API:
    • .sink { }: 가장 널리 쓰이는 구독 방식
    • .assign(to:on:): 값을 특정 속성에 자동 바인딩

예제

let publisher = [10, 20, 30].publisher

publisher
    .sink { value in
        print("받은 값: \(value)")
    }

🔁 Subject (Publisher + Subscriber)

개념 요약

  • Subject는 데이터를 직접 발행할 수 있는 특별한 Publisher
  • 외부에서 값을 send()로 수동 발행 가능
  • 동시에 구독도 가능 (Publisher + Subscriber 역할)

✅ Subject 종류 비교

Subject 타입특징
PassthroughSubject과거 이벤트를 저장하지 않음. 새 구독자에게는 새 이벤트만 전달
CurrentValueSubject항상 최신값을 유지. 구독 시 최신값을 즉시 전달

✅ PassthroughSubject 예제

import Combine

let subject = PassthroughSubject<String, Never>()

let subscriber = subject
    .sink { value in
        print("받은 값: \(value)")
    }

subject.send("🚀 첫 번째 이벤트")
subject.send("🔥 두 번째 이벤트")

출력:

받은 값: 🚀 첫 번째 이벤트
받은 값: 🔥 두 번째 이벤트

✅ CurrentValueSubject 예제

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 등)

✅ 마무리 요약

주제핵심 내용
CombineApple의 반응형 비동기 이벤트 처리 프레임워크
Publisher데이터를 발행하는 주체
Subscriber데이터를 구독하고 처리하는 객체
Operator데이터를 중간에서 변환/필터링
Subject (Passthrough)상태 저장 없이 이벤트만 전달
Subject (CurrentValue)최신 상태를 유지하고 즉시 전달 가능
.sink {}가장 널리 쓰이는 구독 메서드
profile
iOS 개발자 공부하는 Roy

0개의 댓글