2017-03-16 5 views
1

私はCocoaAsyncSocketとSTOMPプロトコルに基づいた簡単なメッセージングアプリケーションを作成しています。CocoaAsyncSocketでのPublishSubjectの正しい使い方

class StompStream: NSObject { 
//MARK: - Public 
    var inputFrame = PublishSubject<StompFrame>() 

//MARK: - Private 
    fileprivate var socket: GCDAsyncSocket! 
    ... 
    ... 
    fileprivate func parse(withData data: Data) { 
     let string = String(data: data, encoding: .utf8) 
     do { 
      let frame = try StompFrame(text: string) 
      self.inputFrame.on(.next(frame)) 
     } catch { 
      self.inputFrame.on(.error(error)) 
     } 
    } 
} 
//MARK: - GCDAsyncSocketDelegate methods 
extension StompStream: GCDAsyncSocketDelegate { 
    ... 
    ... 
    func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) { 
     self.parse(withData: data) 
    } 
} 

ので、inputFrameを読みたい人他には、単に実行します:

fileprivate func subscribeToEvents() { 
    self.stompStream.inputFrame 
     .observeOn(SerialDispatchQueueScheduler(queue: Queues().stompQueue, internalSerialQueueName: "stomp")) 
     .subscribe(onNext: { inputFrame in 
      //do some stuff 
     }).addDisposableTo(self.disposeBag) 
} 

私の加入者は、このような何かを、着信STOMPフレームを観察することができますので、だから私は、PublishSubjectを使用するメインクラスを作成しました私はRxSwiftにはとても新しく、Observable<StompFrame>を使ったほうがいいと思っていますが、イベントを読むだけなら、PublishSubjectを使ってこのように-PublishSubject<StompFrame>()Observable<StompFrame>のように私はそれを行うことができますそのようなものは、何も作成せずにfunc、wher e私はObservable.create { }を返すので、誰かがイベントを受け取りたいときはいつも、それはObservable<StompFrame>をもう1つ作成しますが、PublishSubjectはそれだけです。コードが不可欠からの反世界に橋渡しされているので私にこのRxのものを説明する任意の助け 感謝:)

答えて

1

、ここではそれはボンネットの下にPublishSubjectを使用する意味があります。

この件を非公開にして、Observableのみを外部ユーザーに公開することをお勧めします。

class StompStream: NSObject { 
    var inputFrame: Observable<StompFrame> { 
     return inputFrameSubject.asObservable() 
    } 

    private let inputFrameSubject = PublishSubject<StompFrame>() 

    // ... 
} 

件名の使用について疑問がある場合は、必ずthis postを参照してください。 C#用に書かれていますが、このトピックの参考になります。

関連する問題