간단한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
}
이런 식으로 사용하면 된다.