Observer-kuvion vaihtoehdot
Vertaa sitä delegaatteihin ja Combine-julkaisijoihin.
Observer-kuvion vaihtoehdot on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Swift Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Swift Academy-kurssilla on yhteensä 4 oppituntia.
Tarkkailijamallin vaihtoehdot
NotificationCenter on yksi tapa reagoida tapahtumiin. Swift tarjoaa myös muita vaihtoehtoja: delegointi, Combine ja asynkroniset streamit. Kukin sopii erilaiseen viestintärakenteeseen.
Tarkkailijamalli
Tarkkailijamallin avulla objektit voivat tilata tapahtumia kohteelta. NotificationCenter on sen globaali, löyhästi kytketty toteutus.
import Foundation
// Subject posts, observers react, neither holds the other.
NotificationCenter.default.post(name: Notification.Name("tick"), object: nil)
print("Broadcast an event")Delegointi
Delegaatti on yhdeltä yhdelle -yhteys: objekti välittää tietyt tapahtumat yhdelle delegaatille protokollan avulla. Se on eksplisiittinen ja tyyppiturvallinen.
protocol DownloadDelegate: AnyObject {
func didFinish(_ bytes: Int)
}
class Downloader {
weak var delegate: DownloadDelegate?
func finish() { delegate?.didFinish(1024) }
}
print("Delegate is one-to-one and typed")Delegaatti vai ilmoitus
Käytä delegaattia, kun täsmälleen yksi objekti tarvitsee tapahtuman ja suhde on selkeä. Käytä NotificationCenteriä, kun monet ennalta tuntemattomat tarkkailijat voivat reagoida.
import Foundation
// One listener -> delegate. Many/unknown listeners -> NotificationCenter.
print("Cardinality guides the choice")Combine-julkaisijat
Combine mallintaa tapahtumat julkaisijoina, joihin tilataan sink-kutsulla. Se tukee muunnosoperaattoreita, kuten map- ja filter-operaattoreita.
import Combine
let subject = PassthroughSubject<Int, Never>()
let c = subject.sink { print("Got \($0)") }
subject.send(5)
_ = cNotificationCenter-julkaisija
Combine yhdistää NotificationCenterin Combineen: publisher(for:) muuttaa ilmoitukset tietovirraksi, jota voit muuntaa.
import Foundation
import Combine
let name = Notification.Name("ping")
let c = NotificationCenter.default.publisher(for: name)
.sink { _ in print("Combine got notification") }
NotificationCenter.default.post(name: name, object: nil)
_ = cCombine-operaattorit
Combinen vahvuus on tapahtumaputkien koostaminen: filter-, debounce-, combine- ja map-operaattoreilla arvoja voidaan suodattaa, viivästää, yhdistää ja muuntaa deklaratiivisesti.
import Combine
let subject = PassthroughSubject<Int, Never>()
let c = subject
.filter { $0 > 0 }
.map { $0 * 2 }
.sink { print($0) }
subject.send(-1)
subject.send(3)
_ = cAsynkroniset sekvenssit
Moderni Swift tarjoaa AsyncStream-tyypin ja ilmoitusten asynkroniset sekvenssit, joten voit käsitellä tapahtumia for await-rakenteella rakenteisessa samanaikaisuudessa.
import Foundation
func listen() async {
let name = Notification.Name("ping")
for await _ in NotificationCenter.default.notifications(named: name) {
print("Async observed")
break
}
}
print("Can await notifications")Closuret ja takaisinsoitot
Yksittäiseen paikalliseen takaisinsoittoon tallennettu closure on yksinkertaisin ratkaisu, eikä se tarvitse lainkaan tarkkailijarakenteita.
struct Button {
var onTap: () -> Void
func tap() { onTap() }
}
Button(onTap: { print("tapped") }).tap()Lähestymistavan valinta
Delegaatti: yhdeltä yhdelle, eksplisiittinen. NotificationCenter: monelta monelle, toisistaan irrotettu. Combine/async: muunnoksia tarvitsevat tietovirrat. Closure: yksinkertaiset paikalliset takaisinsoitot.
import Foundation
// Match the tool to the communication shape.
print("Delegate, Notification, Combine, async, closure")Kompromissit
NotificationCenter on joustava, mutta tyypittämätön ja altis muistivuodoille. Delegointi ja Combine ovat tyyppiturvallisia; Combine ja async tarjoavat enemmän tehoa useampien käsitteiden kustannuksella.
import Foundation
// Prefer typed approaches when the relationship is known.
print("Type safety vs flexibility tradeoff")Pikatarkistus
Mikä mekanismi sopii parhaiten selkeään, yhdeltä yhdelle -tyyppiturvalliseen suhteeseen?
Kertaus
Tarkkailijamallilla on Swiftissä useita muotoja: NotificationCenter toisistaan irrotettuihin monelta monelle -tapahtumiin, delegointi tyypitettyihin yhdeltä yhdelle -yhteyksiin, Combine ja asynkroniset sekvenssit koostettaviin tietovirtoihin sekä closuret yksinkertaisiin takaisinsoittoihin. Valitse ratkaisu viestinnän muodon ja tyyppiturvallisuustarpeiden perusteella. Kurssi päättyy tähän.
Opi Swift tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 122
- Oppitunnit
- 409
Usein kysytyt kysymykset
Onko oppitunti ”Observer-kuvion vaihtoehdot” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “Observer-kuvion vaihtoehdot”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Swift Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Observer-kuvion vaihtoehdot”?
Vertaa sitä delegaatteihin ja Combine-julkaisijoihin. Harjoittelet Swift Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Swift Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Swift Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Observer-kuvion vaihtoehdot”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Swift Academy-oppitunnilla?
Kyllä. Jokainen Swift Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Ilmoitusten lähettäminen ja tarkkailu
- Ilmoitusten userInfo-sisällöt
- Tarkkailijoiden turvallinen poistaminen
- Observer-kuvion vaihtoehdot