간단한Combine

작성일

급하게 Combine을 사용할 일이 있어가지고, 간단하게 살펴보려고한다.
우선 임포트해준다.

import Combine

Service는 API를 통신하고 가져온후, @Published에 담아주고 있는거라고 생각하면 된다.

class AdvancedCombineDataService {

  @Published var basicPublisher: [String] = []

  init() {
    publishFakeData()
  }

  private func publishFakeData() {
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
      self.basicPublisher = ["one", "two", "three"]
    }
  }
}

ViewModel은 Service에서 가져온 데이터로 여러가지 데이터를 가공하는 class이다.

class AdvancedCombineBootcampViewModel: ObservableObject {

  @Published var data: [String] = []
  let dataService = AdvancedCombineDataService()

  var cancellables = Set<AnyCancellable>()

  init() {
    addSubscribers()
  }

  private func addSubscribers() {
    dataService.$basicPublisher
      .sink { completion in
        switch completion {
          case .finished:
            break
          case .failure(let error):
            print("ERROR: \(error.localizedDescription)")
          }
      } receiveValue: { [weak self] returnedValue in
        self.data = returnedValue
      }
        .store(in: $cancellablse)
  }
}

사용할땐, 사용할 뷰에

struct AdvancedCombineBootcamp: View {
  @StateObject private var vm = AdvancedCombineBootcampViewModel()
  // ex) vm.data
}

이런 식으로 사용하면 된다.