2016-05-03 11 views
0

Wie implementiere ich einen Event Emitter mit RxSwift? (Ein Objekt, das Daten ausgeben kann, die von anderen Objekten konsumiert werden, die es abonniert haben.)Wie gebe ich Ereignisse manuell aus (d. H. Einen EventEmitter) mit RxSwift?

Nachdem ich die Rx-Dokumente und Beispiele durchgegangen bin, fühle ich mich wie ein kompletter Idiot und bin immer noch sehr verwirrt darüber, wie man Ereignisse manuell ausgibt von Beobachtern zu Observablen. Mein Verständnis, dass wir einige Observable haben, die Ereignisse mit Daten an alle Beobachter senden können, die diese Observable abonniert haben. Ich habe jedoch keine Idee, wie dies in Swift umgesetzt wird.

Hier ist ein Beispiel für etwas, ich versuche zu implementieren:

class VendingMachine { 

    let dispenser = Observable<Drink> 

    // Notify all subscribed Observers that this machine dispensed a drink. 
    func dispenseDrink(item: Drink) { 
     dispenser.onNext(item) 
    } 

} 

und eine zweite Datei:

class MachineReporter: Observer { 

    let dispenser = VendingMachine().dispenser 

    init() { 
     dispenser.subscribe(self) 
    } 

    onNext { drink in 
     print("Vending machine dispensed a drink: \(drink)" 
    } 

} 

ist mein Gehirn gebraten. Ich werde jetzt einfach in eine spezialisierte Bibliothek wie EmitterKit wechseln, weil ich eindeutig falsch verstehe, wie das funktioniert.

Aber ich muss herausfinden, wie Rx funktioniert oder ich werde verrückt werden. Hilfe!

Antwort

2

Ich bin ziemlich verwirrt über das, was Sie mit MachineReporter tun wollen, so dass mein Code nur funktioniert, obwohl es nicht sehr nützlich sein kann.

Ich würde sehr empfehlen, dass Sie durch die RxSwift Playground examples gehen und stellen Sie sicher, dass Sie sich mit denen wohl fühlen. Ihre Frage betrifft insbesondere Subject s. Das sollte dich über den anfänglichen "Buckel" der Unbequemlichkeit und Frustration hinwegbringen. Davon höre ich definitiv, aber es ist eine andere Art zu denken, aber es lohnt sich, diese erste Hürde zu überwinden. Bleib dabei.

class VendingMachine { 

    let dispenser = PublishSubject<Drink>() 

    func dispenseDrink(item: Drink) { 
     dispenser.onNext(item) 
    } 
} 

class MachineReporter { 

    let disposeBag = DisposeBag() 
    let dispenser = VendingMachine().dispenser 

    init() { 
     dispenser.asObservable() 
      .subscribeNext { drink in 
       print("Vending machine dispensed a drink: \(drink)") 
      } 
      .addDisposableTo(disposeBag) 
    } 
} 
1

Verwenden Sie hierfür eine Subject.

Ein Subject ist eine spezielle Form einer Observable Sequence, Sie können abonnieren und Elemente hinzufügen. Es gibt 4 Arten von Themen in RxSwift

http://reactivex.io/documentation/subject.html

würde ich empfehlen, hier ein PublishSubject Anfahren mit.

let observable = PublishSubject<SomeTypeOrEvent>() 

observable.subscribe(onNext: { (SomeTypeOrEvent) in 
    self.doSomethingWithEvent(something: SomeTypeOrEvent) 
}).addDisposableTo(disposeBag) 

... 

// emits some type/event 
observerable.onNext(SomeTypeOrEvent)