単一の結果を持つ一度きりの非同期処理(ネットワーク呼び出し、ファイル読み込み)には async/await を使い、時間とともに流れる値のストリーム — UIイベント、デバウンスされた検索テキスト、継続的な更新 — には Combine(または AsyncSequence)を使います。これらは異なる形の問題を解決するもので、現代のコードはしばしば両者を混在させます。
Task をキャンセルするとその子もキャンセルされます)。map、debounce、combineLatest)を通じてモデル化し、バックプレッシャーと宣言的なコンポジションを備えます。// Combine: a live, transformed stream — perfect for search-as-you-type
searchText
.debounce(for: .milliseconds(300), scheduler: RunLoop.main) // wait for pause
.removeDuplicates()
.map { query in APIClient.search(query) } // -> Publisher
.switchToLatest() // cancel stale requests
.receive(on: RunLoop.main)
.assign(to: &$results)
// async/await: a single fetch — linear and readable
func loadDetail(id: Int) async throws -> Detail {
try await api.fetchDetail(id) // one value, then done
}
もはやCombineのすべての機構が必要になることはめったにありません。AsyncSequence と for await が多くのストリーミングのケースをネイティブにカバーし、ブリッジもできます。publisher.values はCombineのpublisherを AsyncSequence として公開します。
for await value in publisher.values { // consume Combine stream with async/await
process(value)
}
debounce + combineLatest + switchToLatest)や、@Published および既存のCombineコードと統合する場合に。AnyCancellable の生存期間を手動で管理する必要があります。間違ったツールを選ぶと、些細な一度きりの呼び出しにCombineパイプラインを使う(過剰設計)か、debounce 演算子で済むところに手書きの状態機械を作ることになります。シニア面接官は、あなたがデータの形 — 単一の値かストリームか — を正しい抽象化に対応づけ、async/awaitが今やデフォルトだと知っているかを見たいのです。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する