프로젝트 쉽고를 SwiftUI로 진행하는 것을 채택하고 비동기 프로그래밍으로 Combine을 채택했었다.
우선, RxSwift가 아닌 Combine을 채택한 이유는 SwiftUI와 Combine이 굉장히 궁합이 좋다고 알고 있었기 때문이다. 또한 Combine은 Apple에서 2019년에 만든 새로운 프레임워크이며, RxSwift의 애플 버젼이기 때문에 미래에 많이 사용될 것 같아서가 주된 이유이다.
이러한 이유로 Combine을 사용했고, 이에 대해 내용을 정리해보고자 한다.
Combine 주요 구성 요소
Publisher
- Subscriber 객체에 변경되는 값을 내보낼 타입을 선언하기 위한 프로토콜이다.
- Output, Failure 타입이 제네릭으로 구현되어있다.
Subscriber
- Publisher에게 값을 받을 수 있는 타입을 선언하기 위한 프로토콜이다.
- Input, Failure 타입이 제네릭으로 구현되어있다.
Operator
- Publisher 프로토콜에 선언되있다.
- Publisher가 내보내는 값을 처리하는 메소드들이다.
- Input, Output을 가지고 있다.
프로젝트 내 Combine 사용 예제
1. ShowModel.swift
struct ShowModel: Identifiable {
let id = UUID().uuidString
let isComplete: Bool
let company: String
let invoice: String
let name: String
let currentStep: Double
let itemWhere: String
let time: String
}
2. MainViewModel.Swift
class MainViewModel: ObservableObject {
@Published var searchText = ""
@Published var trackingModels: [ShowModel] = []
@Published var searchModels: [ShowModel] = []
private var cancellables = Set<AnyCancellable>()
.
.
.
$searchText
.combineLatest($trackingModels)
.debounce(for: .seconds(0.5), scheduler: DispatchQueue.main)
.map(filtering)
.sink { [weak self] (models) in
self?.searchModels = models
}
.store(in: &cancellables)
.
.
.
}
private func filtering(text: String, models: [ShowModel]) -> [ShowModel] {
guard !text.isEmpty else { return models }
let lowercasedText = text.lowercased()
return models.filter { model in
return model.invoice.lowercased().contains(lowercasedText) ||
model.name.lowercased().contains(lowercasedText)
}
}
우선 searchText는 검색창으로 사용자가 가지고 있는 택배 정보를 조회할 때 사용되는 문자열이다.
trackingModel에는 나와있진 않지만 사용자의 택배 정보 리스트가 담겨있는 ShowModel 배열이다.
$searchText.combineLatest($trackingModels)를 활용해 searchText와 TrackinModels을 결합한다.
.debounce는 여러번 발생하는 이벤트에서, 가장 마지막 이벤트 만을 실행 되도록 만든다.
.map(filtering)을 활용해 현재 사용자가 입력한 searchText와 사용자가 가지고 있는 택배 정보 리스트를 비교한 후 [ShowModel]을 반환한다.
.sink를 활용해 $searchText에서 받아오는 값을 처리하고 이벤트 완료에 대해서 처리한다.
.store(in: $cancellables)를 활용해 $searchText의 인스턴스가 해제되는 경우 그 안에 있던 구독들을 해제하는 역할을 수행.
combine에서는 이벤트 스트림을 action이라 하고, action을 취소할 수 있는 프로토콜이 Cancellable이다.
'iOS 개발 > Combine' 카테고리의 다른 글
[Combine] Operater란? (1) (1) | 2023.05.25 |
---|---|
[Combine] Publisher Future와 CompletionHandler의 차이 (0) | 2023.05.24 |
[Combine] CurrentValueSubject & PassthroughSubject 예제(2 - 1) (0) | 2023.05.18 |
[Combine] Subject 정의 및 예제(2) (0) | 2023.05.18 |
[Combine] Publisher & Subscriber란?(1) (0) | 2023.05.16 |