gpt4 book ai didi

swift - PublishSubject 与 CocoaAsyncSocket 的正确用法

转载 作者:行者123 更新时间:2023-11-28 06:22:52 26 4
gpt4 key购买 nike

我正在创建基于 CocoaAsyncSocket 和 STOMP 协议(protocol)的简单消息传递应用程序。所以我创建了主类,它使用 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 的东西 :)

最佳答案

因为代码是从命令式世界到响应式(Reactive)世界的桥梁,所以在这里使用 PublishSubject 幕后 是有意义的。

一个好的做法是将这个主题设为私有(private),并且只将 Observable 暴露给外部用户。

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

private let inputFrameSubject = PublishSubject<StompFrame>()

// ...
}

当不确定是否使用主题时,我总是引用 this post .虽然它是为 C# 编写的,但它是该主题的一个很好的引用。

关于swift - PublishSubject 与 CocoaAsyncSocket 的正确用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42824002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com