首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PublishSubject与CocoaAsyncSocket的正确使用

PublishSubject与CocoaAsyncSocket的正确使用
EN

Stack Overflow用户
提问于 2017-03-16 01:58:54
回答 1查看 323关注 0票数 1

我正在创建基于CocoaAsyncSocket和STOMP协议的简单消息应用程序。所以我创建了main类,它使用PublishSubject,这样订阅者就可以观察到传入的STOMP帧,如下所示:

代码语言:javascript
复制
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的人只需这样做:

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

我对RxSwift非常陌生,我读到,如果我们只想阅读事件,最好使用Observable<StompFrame>,但是使用PublishSubject,我可以这样理解它-- PublishSubject<StompFrame>(),使用Observable<StompFrame>,我无法理解如何做这样的事情,如果不创建一些func,我就会返回Observable.create { },所以每次如果有人想要接收事件,它就会创建另一个Observable<StompFrame>,但是对于PublishSubject,它只是其中一个。谢谢你能帮我解释一下Rx的内容:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-22 05:56:21

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

一个好的做法是使这个主题成为私有的,并且只向外部用户公开Observable

代码语言:javascript
复制
class StompStream: NSObject {
    var inputFrame: Observable<StompFrame> { 
        return inputFrameSubject.asObservable() 
    }

    private let inputFrameSubject = PublishSubject<StompFrame>()

    // ...
}

当我怀疑是否使用某一主题时,我总是提到这个职位。虽然是为C#编写的,但对于这个主题来说,它是一个很好的参考。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42824002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档