Combine을 이용해 데이터를 UI에 바인딩하는 흐름은 아래와 같다.
🌟Publisher 생성: 데이터 소스로부터 데이터를 방출하는 Publisher를 생성
🌟Subscriber 연결: 이 Publisher를 UI 컴포넌트에 연결하는 Subscriber를 설정
🌟Data 변환 및 처리: 필요에 따라 map, filter, combineLatest 등의 연산자를 사용하여 데이터를 변환 및 조합
🌟Main Thread에서 UI 업데이트
주로 SwiftUI에서 viewModel과 view를 다음과 같이 바인딩한다.
import SwiftUI
import Combine
// ObservableObject를 구현한 ViewModel
class ViewModel: ObservableObject {
@Published var text: String = ""
}
struct MainView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
TextField("text", text: $viewModel.text)
Text("You entered: \(viewModel.text)")
}
}
그렇다면 UIKit과 Combine은 어떻게 상호작용할까?
UIKit에서는 AnyCancellable을 사용하여 데이터를 바인딩한다.
import UIKit
import Combine
class ExampleViewController: UIViewController {
private var textField: UITextField!
private var label: UILabel!
private var cancellables = Set<AnyCancellable>()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
// UITextField의 텍스트 변경을 감지하는 Publisher 설정
let publisher = NotificationCenter.default.publisher(for: UITextField.textDidChangeNotification, object: textField)
.map { ($0.object as! UITextField).text ?? "" }
// Publisher를 UILabel에 바인딩
publisher
.assign(to: \.text, on: label)
.store(in: &cancellables)
}
private func setupUI() {
// UI 초기화 및 레이아웃
}
}
위 예제에서는 NotificationCenter를 사용하여 UITextField의 변경 사항을 감지하는 publisher를 만들고, assign(to:on:)을 사용하여, 이를 UILabel의 text 속성에 바인딩한다. cancellables 는 subscription을 유지 관리하는 데 사용한다.