Swift 使用CocoaAsyncSocket正确使用PublishSubject

Swift 使用CocoaAsyncSocket正确使用PublishSubject,swift,observable,rx-swift,cocoaasyncsocket,Swift,Observable,Rx Swift,Cocoaasyncsocket,我正在创建基于CocoaAsyncSocket和STOMP协议的简单消息传递应用程序。所以我创建了main类,它使用PublishSubject,这样订阅者就可以观察到传入的跺脚帧,如下所示: class StompStream: NSObject { //MARK: - Public var inputFrame = PublishSubject<StompFrame>() //MARK: - Private fileprivate var socket: GC

我正在创建基于CocoaAsyncSocket和STOMP协议的简单消息传递应用程序。所以我创建了main类,它使用
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)
    }
}
我对RxSwift很陌生,我读到,如果我们只想阅读事件,最好使用
可观察的
,但是对于PublishSubject,我可以这样初始化-
PublishSubject()
,而对于
可观察的
我不知道如何做这样的事情,而不创建一些
函数,在这里,我将返回
Observable.create{}
,因此每次如果有人想要接收事件,它都会创建另一个
Observable
,但是使用
PublishSubject
它只是一个。
谢谢你帮我解释这个Rx的东西:)

因为代码是从命令式世界到反应式世界的桥梁,在这里,在引擎盖下使用
PublishSubject
是有意义的

一个好的做法是将该主题私有化,并且只向外部用户公开
可观察的

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

    private let inputFrameSubject = PublishSubject<StompFrame>()

    // ...
}
类StompStream:NSObject{
var inputFrame:可观察{
返回inputFrameSubject.asObservable()
}
私有let inputFrameSubject=PublishSubject()
// ...
}
当我对是否使用某个主题有疑问时,我总是参考。虽然是为C#编写的,但它是本主题的一个很好的参考

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

    private let inputFrameSubject = PublishSubject<StompFrame>()

    // ...
}