Home Articles

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

Asked
Viewed 537 times
1

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

在浏览了Rx文档和示例之后,我觉得自己是一个完全白痴,并且仍然非常困惑如何从Observers手动发出事件到Observables . 我的理解是我们有一些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是如何工作的,否则我会发疯 . 救命!

2 Answers

  • 3

    应该使用 Subject .

    Subject是Observable Sequence的一种特殊形式,您可以订阅并添加元素 . RxSwift中有4种主题

    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)
    
  • 1

    我'm pretty confused about what you'正在计划使用 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)
        }
    }
    

Related