단일 결과를 갖는 일회성 비동기 작업(네트워크 호출, 파일 읽기)에는 async/await를 사용하고, 시간에 따른 값의 스트림 — UI 이벤트, 디바운스된 검색 텍스트, 지속적인 업데이트 — 에는 Combine(또는 AsyncSequence)을 사용하세요. 둘은 서로 다른 형태의 문제를 해결하며, 현대 코드는 종종 이 둘을 섞어 씁니다.
Task를 취소하면 그 자식도 취소).map, debounce, combineLatest)를 통해 *"도착하는 여러 값에 반응하라"*를 모델링하며, 배압(backpressure)과 선언적 조합을 제공합니다.// Combine: 실시간으로 변환되는 스트림 — 타이핑 중 검색에 완벽
searchText
.debounce(for: .milliseconds(300), scheduler: RunLoop.main) // 멈춤을 기다림
.removeDuplicates()
.map { query in APIClient.search(query) } // -> Publisher
.switchToLatest() // 오래된 요청 취소
.receive(on: RunLoop.main)
.assign(to: &$results)
// async/await: 단일 페치 — 선형적이고 읽기 쉬움
func loadDetail(id: Int) async throws -> Detail {
try await api.fetchDetail(id) // 하나의 값, 그리고 완료
}
이제 Combine의 완전한 기계 장치가 거의 필요 없습니다. AsyncSequence와 for await가 많은 스트리밍 사례를 네이티브로 처리하며, 연결도 가능합니다. publisher.values는 Combine 퍼블리셔를 AsyncSequence로 노출합니다.
for await value in publisher.values { // Combine 스트림을 async/await로 소비
process(value)
}
debounce + combineLatest + switchToLatest)이나 @Published 및 기존 Combine 코드와 통합할 때 말입니다.AnyCancellable 수명을 수동으로 관리해야 합니다.잘못된 도구 선택은 사소한 일회성 호출에 Combine 파이프라인을 쓰거나(과잉 설계), debounce 연산자면 될 것을 손수 만든 상태 기계로 처리하게 만듭니다. 시니어 면접관은 지원자가 데이터의 형태 — 단일 값 vs 스트림 — 를 올바른 추상화에 맞추고, 이제 async/await가 기본값임을 아는지 보고자 합니다.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기