Swift Academy · Oppitunti

Mukautetut julkaisijat ja tilaajat

Rakenna omia Combine-komponentteja.

Oppitunti 4/413 vaihetta

Mukautetut julkaisijat ja tilaajat 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.

Built-in Publisherien ulkopuolelle

Combine sisältää monia Publishereita, mutta joskus sinun on käärittävä muu kuin Combine-rajapinta Publisheriksi tai kulutettava arvoja tarkasti hallitulla backpressure-mekanismilla. Tällöin sinun on toteutettava Publisher- ja Subscriber-protokollat itse.

Publisher-protokolla

Publisher ilmoittaa Output- ja Failure-tyyppinsä sekä toteuttaa receive(subscriber:)-metodin, jossa se antaa tilauksen saapuvalle Subscriberille.

protocol Publisher {
    associatedtype Output
    associatedtype Failure: Error
    func receive<S: Subscriber>(subscriber: S)
        where S.Input == Output, S.Failure == Failure
}

Subscriptionin rooli

Kun Subscriber liittyy mukaan, Publisher luo Subscription-olion. Subscription on linkki, joka hallitsee kysyntää ja toimittaa arvot. Se noudattaa Subscription-protokollaa, joka laajentaa Cancellable-protokollaa.

Mukautettu Subscription

Subscription tallentaa Subscriberin ja vastaa kysyntäpyyntöihin lähettämällä arvoja.

final class CountSubscription<S: Subscriber>: Subscription
    where S.Input == Int {
    private var subscriber: S?
    private var current = 0

    init(subscriber: S) {
        self.subscriber = subscriber
    }

    func request(_ demand: Subscribers.Demand) {
        var remaining = demand
        while remaining > 0 {
            remaining -= 1
            remaining += subscriber?.receive(current) ?? .none
            current += 1
        }
    }

    func cancel() {
        subscriber = nil
    }
}

Mukautettu Publisher

Publisher luo Subscriptionin ja välittää sen Subscriberille receive(subscription:)-metodin avulla.

struct CountPublisher: Publisher {
    typealias Output = Int
    typealias Failure = Never

    func receive<S: Subscriber>(subscriber: S)
        where S.Input == Int, S.Failure == Never {
        let subscription = CountSubscription(subscriber: subscriber)
        subscriber.receive(subscription: subscription)
    }
}

Kysynnän ymmärtäminen

Backpressure on Combinen vuonhallintamekanismi. Subscriber pyytää tietyn määrän Demand-arvoja, eikä Publisher saa lähettää pyydettyä määrää enempää arvoja. receive(_:)-metodista palautettu kysyntä kasvattaa sallittua määrää.

Subscriber-protokolla

Mukautettu Subscriber toteuttaa kolme metodia: se vastaanottaa Subscriptionin, sitten kunkin arvon ja lopuksi suorituksen päättymisen ilmoituksen.

protocol Subscriber {
    associatedtype Input
    associatedtype Failure: Error
    func receive(subscription: Subscription)
    func receive(_ input: Input) -> Subscribers.Demand
    func receive(completion: Subscribers.Completion<Failure>)
}

Mukautettu Subscriber

Tässä Subscriber pyytää aluksi kaksi arvoa ja sen jälkeen yhden lisäarvon jokaista vastaanottamaansa arvoa kohden sekä tulostaa arvot niiden saapuessa.

final class PrintSubscriber: Subscriber {
    typealias Input = Int
    typealias Failure = Never

    func receive(subscription: Subscription) {
        subscription.request(.max(2))
    }

    func receive(_ input: Int) -> Subscribers.Demand {
        print("Value:", input)
        return .max(1)
    }

    func receive(completion: Subscribers.Completion<Never>) {
        print("Done")
    }
}

Delegate-rajapinnan kääriminen

Mukautettujen Publisherien käytännöllinen sovellus on delegate- tai callback-rajapinnan yhdistäminen Combineen, jolloin vanhasta koodista tulee yhdisteltävää. Subscriber tallennetaan ja delegaten callbackit välitetään receive(_:)-kutsuina.

Suosi Subjecteja aina kun mahdollista

Protokollien toteuttaminen käsin on harvoin tarpeen. Useimmissa yhdistämistapauksissa PassthroughSubject tai CurrentValueSubject on paljon yksinkertaisempi — sinun tarvitsee vain kutsua send(_:)-metodia.

let subject = PassthroughSubject<Int, Never>()

subject
    .sink { print($0) }
    .store(in: &cancellables)

subject.send(1)
subject.send(2)

Milloin kannattaa tehdä oma toteutus

Valitse mukautetut Publisher- ja Subscriber-toteutukset, kun tarvitset:

  • tarkan backpressure-hallinnan
  • monimutkaisen muun kuin Combine-lähteen tehokkaan käärimisen
  • uudelleenkäytettäviä, tyyppiturvallisia operaattoreita

Muussa tapauksessa Subjectit ja valmiit operaattorit ovat oikea ratkaisu.

Pikatarkistus

Testaa mukautettuja Publishereita koskevat tietosi.

Kertaus

Opit toteuttamaan Combinen keskeiset protokollat:

  • Publisher luo jokaiselle Subscriberille oman Subscription-olion
  • Subscription noudattaa Demand-arvoa eli hallitsee backpressurea
  • Subscriber vastaanottaa Subscriptionin, arvot ja suorituksen päättymisen ilmoituksen
  • Suosi Subjecteja useimmissa yhdistämistarpeissa

Näiden sisäisten toimintaperiaatteiden ymmärtäminen selventää, miten Combine toimii kokonaisuudessaan.

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 ”Mukautetut julkaisijat ja tilaajat” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “Mukautetut julkaisijat ja tilaajat”. 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 ”Mukautetut julkaisijat ja tilaajat”?

Rakenna omia Combine-komponentteja. 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 ”Mukautetut julkaisijat ja tilaajat”-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. Virtojen muuntaminen ja yhdistäminen
  2. Ajastimet ja säikeistys
  3. Virheenkäsittelyoperaattorit
  4. Mukautetut julkaisijat ja tilaajat
← Takaisin: Swift Academy