Transformation og kombination af streams
Brug flatMap, merge, combineLatest og zip.
Transformation og kombination af streams er en gratis Swift Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Swift Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Swift Academy-kurset indeholder 4 lektioner i alt.
Arbejde med datastrømme
I Combine udsender en publisher en strøm af værdier over tid. Den virkelige styrke kommer fra operatorer, der omdanner og kombinerer disse strømme til nye strømme.
Denne lektion gennemgår de vigtigste operatorer til omdannelse og kombination: flatMap, merge, combineLatest og zip.
map vs flatMap
map omdanner hver værdi til en anden værdi. flatMap går et skridt videre – den omdanner hver værdi til en ny publisher og flader resultaterne ud til én samlet strøm.
Brug flatMap, når hvert input skal udløse en anden asynkron handling.
flatMap i praksis
Her omdannes en strøm af bruger-id'er til en strøm af netværksanmodninger, som flades ud til én strøm af brugere.
userIdPublisher
.flatMap { id in
apiClient.fetchUser(id: id)
}
.sink { user in
print("Loaded", user.name)
}
.store(in: &cancellables)Styring af samtidighed i flatMap
Som standard abonnerer flatMap på alle indre publishers på én gang. Du kan begrænse samtidigheden med maxPublishers for at undgå at overbelaste en server.
idsPublisher
.flatMap(maxPublishers: .max(2)) { id in
apiClient.fetchUser(id: id)
}
.sink { print($0) }
.store(in: &cancellables)merge
merge fletter værdier fra flere publishers af samme type til én strøm og udsender hver værdi, så snart den ankommer.
let combined = buttonTapA
.merge(with: buttonTapB)
combined
.sink { print("A tap from either button") }
.store(in: &cancellables)combineLatest
combineLatest udsender en værdi, hver gang en vilkårlig input-publisher udsender en værdi, og kombinerer den med den nyeste værdi fra hver af de andre. Den er perfekt til validering af formularer, hvor flere felter skal tages i betragtning.
usernamePublisher
.combineLatest(passwordPublisher)
.map { name, pass in
!name.isEmpty && pass.count >= 8
}
.sink { isValid in
print("Form valid:", isValid)
}
.store(in: &cancellables)Sådan fungerer combineLatest
Bemærk: combineLatest udsender ikke noget, før alle input har produceret mindst én værdi. Derefter udløser hver ny udsendelse fra et input det kombinerede output med de andres seneste værdier.
zip
zip parrer værdier efter indeks: den første fra A med den første fra B, den anden med den anden og så videre. Den venter på, at begge sider har en værdi på hver position.
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 vs zip
De to er nemme at forveksle:
- combineLatest – udløses ved enhver udsendelse og bruger den nyeste værdi fra hver
- zip – udløses kun for par, der matcher efter indeks
Brug combineLatest til tilstand, der opdateres løbende, og brug zip til at justere parallelle resultater én til én.
Kombination til parallelt arbejde
zip er ideel, når uafhængige anmodninger køres parallelt, og du venter på dem alle.
fetchProfile
.zip(fetchSettings)
.sink { profile, settings in
print("Both loaded")
}
.store(in: &cancellables)Kædning af operatorer
Virkelige forløb kæder flere operatorer sammen for deklarativt at udtrykke komplekse asynkrone flows.
searchTextPublisher
.removeDuplicates()
.flatMap { query in
apiClient.search(query)
}
.map { results in
results.prefix(10)
}
.sink { print($0) }
.store(in: &cancellables)Hurtigt tjek
Test din viden om operatorer.
Opsummering
Du har lært at omdanne og kombinere datastrømme:
- flatMap – værdi til publisher, fladet ud
- merge – fletter strømme af samme type
- combineLatest – den nyeste værdi fra hver, udløses ved enhver udsendelse
- zip – par, der matcher efter indeks
Disse operatorer lader dig sammensætte kompleks asynkron logik deklarativt.
Lær Swift med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 122
- Lektioner
- 409
Ofte stillede spørgsmål
Er lektionen “Transformation og kombination af streams” gratis?
Ja — alle 3 lektioner i læringssporet Swift Academy, inklusive “Transformation og kombination af streams”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Swift Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Transformation og kombination af streams”?
Brug flatMap, merge, combineLatest og zip. Du øver dig i Swift Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Swift Academy?
Der kræves ingen tidligere erfaring. Swift Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Transformation og kombination af streams”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Swift Academy-lektion?
Ja. Alle Swift Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Transformation og kombination af streams
- Schedulers og threading
- Operatorer til fejlhåndtering
- Brugerdefinerede publishers og subscribers