Trasformazione e combinazione degli stream
Usi flatMap, merge, combineLatest e zip.
Trasformazione e combinazione degli stream è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.
Lavorare con gli stream
In Combine, un publisher emette uno stream di valori nel tempo. La vera potenza deriva dagli operatori che trasformano e combinano questi stream per crearne di nuovi.
Questa lezione illustra gli operatori più importanti per trasformare e combinare gli stream: flatMap, merge, combineLatest e zip.
map e flatMap
map trasforma ogni valore in un altro valore. flatMap va oltre: trasforma ogni valore in un nuovo publisher e appiattisce i risultati in un unico stream.
Usi flatMap quando ogni input deve avviare un'altra operazione asincrona.
flatMap in azione
In questo caso, uno stream di ID utente viene trasformato in uno stream di richieste di rete, quindi appiattito in un unico stream di utenti.
userIdPublisher
.flatMap { id in
apiClient.fetchUser(id: id)
}
.sink { user in
print("Loaded", user.name)
}
.store(in: &cancellables)Controllare la concorrenza di flatMap
Per impostazione predefinita, flatMap si sottoscrive contemporaneamente a tutti i publisher interni. Può limitare la concorrenza con maxPublishers per evitare di sovraccaricare un server.
idsPublisher
.flatMap(maxPublishers: .max(2)) { id in
apiClient.fetchUser(id: id)
}
.sink { print($0) }
.store(in: &cancellables)merge
merge interleave i valori provenienti da più publisher dello stesso tipo in un unico stream, emettendo ogni valore non appena arriva.
let combined = buttonTapA
.merge(with: buttonTapB)
combined
.sink { print("A tap from either button") }
.store(in: &cancellables)combineLatest
combineLatest emette un valore ogni volta che uno qualsiasi dei publisher di input emette, associando il valore più recente di ciascuno. È perfetto per la validazione di form in cui devono essere considerati tutti i campi.
usernamePublisher
.combineLatest(passwordPublisher)
.map { name, pass in
!name.isEmpty && pass.count >= 8
}
.sink { isValid in
print("Form valid:", isValid)
}
.store(in: &cancellables)Comportamento di combineLatest
Nota: combineLatest non emette nulla finché ogni input non ha prodotto almeno un valore. Dopodiché, ogni nuova emissione di qualsiasi input attiva l'output combinato con i valori più recenti degli altri input.
zip
zip associa i valori in base all'indice: il primo valore di A con il primo di B, il secondo con il secondo e così via. Attende che entrambi i lati abbiano un valore in ogni posizione.
let names = ["Ann", "Bob", "Cy"].publisher
let ages = [30, 25, 41].publisher
names
.zip(ages)
.sink { name, age in
print(name, "is", age)
}
.store(in: &cancellables)combineLatest e zip a confronto
È facile confonderli:
- combineLatest — si attiva a ogni emissione e usa il valore più recente di ciascun input
- zip — si attiva solo con coppie corrispondenti in base all'indice
Usi combineLatest per lo stato aggiornato in tempo reale; usi zip per allineare uno a uno i risultati paralleli.
Combinare per eseguire operazioni in parallelo
zip è particolarmente utile quando si eseguono richieste indipendenti in parallelo e si attende che siano completate tutte.
fetchProfile
.zip(fetchSettings)
.sink { profile, settings in
print("Both loaded")
}
.store(in: &cancellables)Concatenare gli operatori
Le pipeline reali concatenano diversi operatori per esprimere in modo dichiarativo flussi asincroni complessi.
searchTextPublisher
.removeDuplicates()
.flatMap { query in
apiClient.search(query)
}
.map { results in
results.prefix(10)
}
.sink { print($0) }
.store(in: &cancellables)Verifica rapida
Verifichi le Sue conoscenze sugli operatori.
Riepilogo
Ha imparato a trasformare e combinare gli stream:
- flatMap — da valore a publisher, con appiattimento
- merge — interleave di stream dello stesso tipo
- combineLatest — valore più recente di ciascun input, attivato da qualsiasi emissione
- zip — coppie corrispondenti per indice
Questi operatori consentono di comporre in modo dichiarativo una logica asincrona complessa.
Domande Frequenti
La lezione «Trasformazione e combinazione degli stream» è gratuita?
Sì — il testo completo di «Trasformazione e combinazione degli stream» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.
Cosa imparerò in «Trasformazione e combinazione degli stream»?
Usi flatMap, merge, combineLatest e zip. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Swift Academy?
Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Trasformazione e combinazione degli stream»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Swift Academy?
Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Trasformazione e combinazione degli stream
- Scheduler e threading
- Operatori per la gestione degli errori
- Publisher e subscriber personalizzati