我正在创建基于CocoaAsyncSocket和STOMP协议的简单消息应用程序。所以我创建了main类,它使用PublishSubject,这样订阅者就可以观察到传入的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)
}
}因此,其他想读inputFrame的人只需这样做:
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的内容:)
发布于 2017-03-22 05:56:21
因为代码是从命令式到反应性世界的桥梁,在这里使用PublishSubject 在下是有意义的。
一个好的做法是使这个主题成为私有的,并且只向外部用户公开Observable。
class StompStream: NSObject {
var inputFrame: Observable<StompFrame> {
return inputFrameSubject.asObservable()
}
private let inputFrameSubject = PublishSubject<StompFrame>()
// ...
}当我怀疑是否使用某一主题时,我总是提到这个职位。虽然是为C#编写的,但对于这个主题来说,它是一个很好的参考。
https://stackoverflow.com/questions/42824002
复制相似问题