【问题标题】:How do I emit events manually (i.e., make an EventEmitter) using RxSwift?如何使用 RxSwift 手动发出事件(即创建 EventEmitter)?
【发布时间】:2016-05-03 02:04:39
【问题描述】:

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

在浏览了 Rx 文档和示例之后,我觉得自己像个彻头彻尾的白痴,仍然对如何手动将事件从 Observer 发送到 Observable 感到非常困惑。我的理解是我们有一些 Observable 可以向订阅该 Observable 的所有观察者发出带有数据的事件。但是,我对如何在 Swift 中实际实现这一点的想法为零。

这是我正在尝试实现的示例:

class VendingMachine {

    let dispenser = Observable<Drink>

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

}

还有第二个文件:

class MachineReporter: Observer {

    let dispenser = VendingMachine().dispenser

    init() {
        dispenser.subscribe(self)
    }

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

}

我的大脑被炸了。我现在只是要切换到像 EmitterKit 这样的专业库,因为我显然误解了它的工作原理。

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

【问题讨论】:

    标签: swift rx-swift reactivex


    【解决方案1】:

    我很困惑你打算用 MachineReporter 做什么,所以我的代码只是解决了让它工作的问题,尽管它可能不是很有用。

    我强烈建议您通过RxSwift Playground examples 并确保您对这些感到满意。您的问题特别涉及Subjects。这应该会让你克服最初的不舒适和沮丧的“驼峰”。不过,我肯定听说过你,这是一种不同的思维方式,但完全值得克服第一个障碍。坚持下去。

    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)
        }
    }
    

    【讨论】:

      【解决方案2】:

      应该为此使用Subject

      Subject 是 Observable Sequence 的一种特殊形式,你可以 订阅并向其添加元素。有4个 RxSwift 中的 Subjects 种类

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-26
        • 2018-07-15
        • 2012-08-31
        相关资源
        最近更新 更多