Swift Academy · Oppitunti

Observer-kuvion vaihtoehdot

Vertaa sitä delegaatteihin ja Combine-julkaisijoihin.

Oppitunti 4/413 vaihetta

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)
_ = c

NotificationCenter-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)
_ = c

Combine-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)
_ = c

Asynkroniset 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.

Aloita maksutta

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

  1. Ilmoitusten lähettäminen ja tarkkailu
  2. Ilmoitusten userInfo-sisällöt
  3. Tarkkailijoiden turvallinen poistaminen
  4. Observer-kuvion vaihtoehdot
← Takaisin: Swift Academy