我正在创建基于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的任何帮助:)
答案 0 :(得分:1)
因为代码是从命令性到反应性世界的桥接,所以在这里使用PublishSubject
是有意义的。
一个好的做法是将此主题设为私有,并仅将Observable
公开给外部用户。
class StompStream: NSObject {
var inputFrame: Observable<StompFrame> {
return inputFrameSubject.asObservable()
}
private let inputFrameSubject = PublishSubject<StompFrame>()
// ...
}
如果对使用某个主题有疑问,我总是提到this post。虽然是为C#编写的,但它是本主题的一个很好的参考。