如何使用RxSwift手动发出事件(即创建一个EventEmitter)?

时间:2016-05-03 02:04:40

标签: swift rx-swift reactivex

如何使用RxSwift实现事件发射器? (可以发出由订阅它的其他对象使用的数据的对象。)

在浏览了Rx文档和示例之后,我觉得自己是一个完全白痴,我仍然非常困惑如何从Observers手动发出事件到Observables。我的理解是我们有一些Observable可以向所有订阅Observable的观察者发出带有数据的事件。但是,我对如何在Swift中实现它没有任何想法。

以下是我尝试实施的一个例子:

class MachineReporter: Observer {

    let dispenser = VendingMachine().dispenser

    init() {
        dispenser.subscribe(self)
    }

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

}

第二个档案:

{{1}}

我的大脑被炸了。我现在只是想切换到像EmitterKit这样的专业图书馆,因为我明显误解了它是如何工作的。

但我需要弄清楚Rx是如何工作的,否则我会发疯。救命啊!

2 个答案:

答案 0 :(得分:3)

我对您计划使用MachineReporter的内容感到非常困惑,所以我的代码只是解决了它的工作原理,尽管它可能不太有用。

我强烈建议你通过RxSwift Playground examples并确保你对这些感到满意。您的问题特别涉及Subject。这应该让你超过最初的"驼峰"不舒服和沮丧。我确实听到了你的观点,但这是一种不同的思维方式,但它完全值得推过第一道障碍。坚持下去。

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 :(得分:1)

此处应使用Subject

  

主题是可观察序列的特殊形式,你可以   订阅并添加元素。有4个   RxSwift中的各种主题

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

我建议在这里开始使用PublishSubject。

let observable = PublishSubject<SomeTypeOrEvent>()

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

...

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