使用CocoaAsyncSocket正确使用PublishSubject

时间:2017-03-16 01:58:54

标签: swift observable rx-swift cocoaasyncsocket

我正在创建基于CocoaAsyncSocket和STOMP协议的简单消息传递应用程序。所以我创建了使用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) } } 的主类,因此订阅者可以观察传入的STOMP帧,如下所示:

inputFrame

所以,其他想要阅读fileprivate func subscribeToEvents() { self.stompStream.inputFrame .observeOn(SerialDispatchQueueScheduler(queue: Queues().stompQueue, internalSerialQueueName: "stomp")) .subscribe( onNext: { inputFrame in //do some stuff }).addDisposableTo(self.disposeBag) } 的人,只需:

Observable<StompFrame>

我对RxSwift很新,我读过,如果我们想要只读取事件,那么使用PublishSubject<StompFrame>()会更好,但是使用PublishSubject我可以像这样初始化它 - Observable<StompFrame>func我无法理解如何做这样的事情,而不创建一些Observable.create { },我将返回Observable<StompFrame>,所以每次如果有人会想要接收事件,它会创建另一个PublishSubject,但python configure.py --platform win32-g++ mingw32-make mingw32-make install 只有一个。{1}}。 感谢您向我解释这个Rx的任何帮助:)

1 个答案:

答案 0 :(得分:1)

因为代码是从命令性到反应性世界的桥接,所以在这里使用PublishSubject 是有意义的

一个好的做法是将此主题设为私有,并仅将Observable公开给外部用户。

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

    private let inputFrameSubject = PublishSubject<StompFrame>()

    // ...
}

如果对使用某个主题有疑问,我总是提到this post。虽然是为C#编写的,但它是本主题的一个很好的参考。