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)")
}
}
NotificationCenter.default
.publisher(for: UITextField.textDidChangeNotification, object: textField)
.compactMap { ($0.object as? UITextField)?.text }
.map { $0.uppercased() }
.sink { print("입력된 텍스트: \($0)") }
이벤트 처리 로직이 한결 간결해진다는 장점!
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
PassthroughSubject와 CurrentValueSubject 두 가지가 자주 사용됨.