Combine: 시작

틀틀보·2025년 4월 21일

Combine

목록 보기
1/4
post-thumbnail

Combine은 값의 흐름(values over time)을 선언형(declarative)으로 처리할 수 있는 애플의 프레임워크입니다.
https://developer.apple.com/documentation/combine

기존 (명령형)

import UIKit

class ViewController: UIViewController {
    let textField = UITextField()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        textField.addTarget(self, action: #selector(textChanged), for: .editingChanged)
    }

    @objc func textChanged(_ sender: UITextField) {
        guard let text = sender.text else { return }
        let uppercasedText = text.uppercased()
        print("입력된 텍스트: \(uppercasedText)")
    }
}
  1. 직접 addTarget을 붙여 이벤트를 감지
  2. 함수로 어떻게 동작할 지를 선언하고
  3. 값을 가공하고 수동 출력

Combine (선언형)

NotificationCenter.default
    .publisher(for: UITextField.textDidChangeNotification, object: textField)
    .compactMap { ($0.object as? UITextField)?.text }
    .map { $0.uppercased() }
    .sink { print("입력된 텍스트: \($0)") }
  1. 데이터가 흐르는 흐름을 그저 정의
  2. 무엇을 할 지를 알려줌

이벤트 처리 로직이 한결 간결해진다는 장점!

핵심 개념

1. Publisher & Subscriber

  • Publisher: 이벤트를 방출하는 주체로, Just, PassthroughSubject, URLSession.DataTaskPublisher 등이 있다.
  • Subscriber: 방출된 이벤트를 처리하는 주체로, 기본 제공 타입인 Subscribers.Sink, Subscribers.Assign 등을 사용하거나 직접 구현 가능.

2. Subscription & Cancellable

  • 구독이 이루어지면 Subscription 객체가 생성되며 Subscriber는 이 Subscription을 통해 Publisher에 데이터를 요청(request)하거나 취소(cancel) 가능
  • Swift에서는 일반적으로 AnyCancellable 타입으로 구독을 저장하여 필요 시, cancel()을 호출해 해제.

3. Operators

  • Transforming: map, compactMap 등을 이용해 스트림의 값을 가공.
  • Filtering: filter, removeDuplicates 등으로 원하는 이벤트만 통과.
  • Combining: merge, zip, combineLatest로 여러 스트림과 결합 가능.

4. Subject

  • 외부에서 임의로 이벤트를 방출할 수 있는 파이프 역할. PassthroughSubjectCurrentValueSubject 두 가지가 자주 사용됨.
profile
안녕하세요! iOS 개발자입니다!

0개의 댓글