Devlog👩🏻‍💻/iOS

[iOS] Combine: @Published, sink, assign

yujjne 2025. 2. 11. 16:21

 

Combine을 통한 데이터 바인딩

ViewModel에서 @Published와 sink, assign을 활용해 뷰에 데이터를 구독하고 실시간으로 UI에 반영할 수 있다.

 

@Published, sink, assign의 사용 방법에 대해 알아보자.

 

1. @Published:

  • ObservableObject 프로토콜을 채택한 클래스에서 사용.
  • 값이 변경될 때마다 뷰(구독자)에게 알림을 보내 UI를 자동으로 업데이트.
@Published var temperature: Double = 0.0

 

2. sink(receiveCompletion:receiveValue:):

  • 퍼블리셔에서 값을 받을 때 사용하는 구독 메서드.
  • 네트워크 요청이 성공하거나 실패할 때 동작을 정의.
WeatherAPIManager.shared.fetchCurrentWeather(lat: lat, lon: lon)
    .sink(receiveCompletion: { completion in
        // 완료 시 처리
    }, receiveValue: { weatherData in
        // 데이터 수신 시 처리
    })
    .store(in: &cancellables)

 

3. assign(to:on:):

  • 퍼블리셔의 값을 특정 객체의 프로퍼티에 직접 할당.
WeatherAPIManager.shared.fetchCurrentWeather(lat: lat, lon: lon)
    .map { $0.main.temp }
    .assign(to: \.temperature, on: self)
    .store(in: &cancellables)