Eigene Subscriber - wurzelsand/swift-memos GitHub Wiki

Eigene Subscriber

Themen

  • Subscriber implementieren

  • Array als Publisher

Aufgabe:

import Combine

class StringSubscriber: Subscriber {
    ...
}

let publisher = ["A", "B", "C", "D"].publisher
let subscriber = StringSubscriber()
publisher.subscribe(subscriber)

Implementiere StringSubscriber so, dass das Programm Folgendes ausgibt:

  • Benachrichtigung, wenn ein Publisher eine Subscription angefordert hat.

  • Benachrichtigung und Inhalt, wenn ein String empfangen wird ("A", "B", ...).

  • Benachrichtigung, nachdem ein Publisher seinen letzten Wert übertragen hat.

Ausführung

import Combine

class StringSubscriber: Subscriber {
    typealias Input = String
    typealias Failure = Never
    
    func receive(subscription: Subscription) {
        print("Subscription received")
        subscription.request(.max(1)) // #1
    }
    
    func receive(_ input: String) -> Subscribers.Demand {
        print("Value received:", input)
        return .max(1) // #2
    }
    
    func receive(completion: Subscribers.Completion<Never>) {
        print("Completed")
    }
}

let publisher = ["A", "B", "C", "D"].publisher
let subscriber = StringSubscriber()
publisher.subscribe(subscriber)

Ausgabe:

Subscription received
Value received: A
Value received: B
Value received: C
Value received: D
Completed

Anmerkungen

  1. subscription.request(.max(1)) bedeutet, dass zunächst höchstens ein Wert angefordert wird.

  2. return .max(1) bedeutet, dass jedesmal bei seinem Aufruf höchstens ein weiterer Wert empfangen werden kann.

⚠️ **GitHub.com Fallback** ⚠️