Swift 使用CocoaAsyncSocket正确使用PublishSubject
我正在创建基于CocoaAsyncSocket和STOMP协议的简单消息传递应用程序。所以我创建了main类,它使用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
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>()
// ...
}