2017-09-04 109 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,但這似乎是正確的。

相關問題