2017-09-04 108 views
0

我计划将来自tcp端口的传入数据视为来自“视图”的数据。我想设置一些RxRuby Observables,然后根据我从tcp端口获得的数据,选择适当的Observable并通过调用on_next方法发布一些内容。如何将一个ruby实例变量设置为RxRuby Observable?

下面的代码工作,但似乎笨拙。传递给Rx::Observable.create的块只是为传入它的observable设置一个实例变量。这不是一个巨大的锅炉板,但有些东西看起来不正确。我错过了什么吗?

require 'rx' 
class GUIMessagePublisher 
    attr_accessor :handshake, :handshake_stream, :remote_button, :remote_button_stream 

    def initialize 
    self.handshake_stream = Rx::Observable.create { |o| self.handshake = o } 
    self.remote_button_stream = Rx::Observable.create { |o| self.remote_button = o } 
    end 

    def publish_handshake 
    handshake.on_next("hello") 
    end 

    def publish_remote_button 
    remote_button.on_next(nil) 
    end 

end 

publisher = GUIMessagePublisher.new 
publisher.handshake_stream.subscribe { |m| puts "message = #{m}"} 
publisher.remote_button_stream.subscribe { puts "remote button clicked" } 
publisher.publish_handshake 
publisher.publish_remote_button 

回答

0

阅读更多的Rx ::主题后,我认为这将是处理这种

require 'rx' 
require 'forwardable' 
class GUIMessagePublisher 
    extend Forwardable 
    attr_accessor :handshake_subject, :remote_button_subject 
    def_delegator :handshake_subject, :as_observable, :handshake_stream 
    def_delegator :remote_button_subject, :as_observable, :remote_button_stream 

    def initialize 
    self.handshake_subject = Rx::Subject.new 
    self.remote_button_subject = Rx::Subject.new 
    end 

    def publish_handshake 
    handshake_subject.on_next("hello") 
    end 

    def publish_remote_button 
    remote_button_subject.on_next("remote button") 
    end 

end 

publisher = GUIMessagePublisher.new 
publisher.handshake_stream.subscribe { |m| puts "message = #{m}"} 
publisher.remote_button_stream.subscribe { |m| puts "remote button clicked, message = #{m}" } 
publisher.publish_handshake 
publisher.publish_remote_button 

使用可转发的是可选的首选方式。我可以通过方法授权,甚至可以在暴露主题上调用.as_observable,但这似乎是正确的。