我有一个读取/写入消息的方法。
fun sendMessage(message: String): Observable<MESSAGE> {
return readMessage().doOnSubscribe {
socket.write(message)
}
}
readMessage()
返回一个发布主题,该主题从流(socket.read()
)中的热观察值中发出值。
protected fun readMessage(): Observable<MESSAGE> {
if (messageSubject == null) {
messageSubject = PublishSubject.create()
socket.read()
.flatMap {
return@flatMap flowTransformer.runLoop(it)
}
.flatMap {
//Do some stuff
}
.subscribe(messageSubject)
}
return messageSubject
}
我在同一个链中的不同点和多次呼叫sendMessage()
。
sendMessage("Message1").flatMap {
sendMessage("Message2")
}.flatMap {
sendMessage("Message 3")
}.subscribe({
//next
}, {
//error
})
问题是当我拨打sendMessage()
时,我可能还没有订阅发布者(因此消息响应被丢弃)。我担心如果我使用ReplaySubject会发出太多消息,因为我使用了很多sendMessage()
。
有些时候,readObservable从第一个sendMessage读取所有下一条消息。这是一个问题,因为解析操作是CPU密集型的。
我怎样才能改善这条链?
答案 0 :(得分:0)
您可以使用缓冲区大小
创建PublishSubjectpublic void ReplaySubjectBufferExample()
{
var bufferSize = 2;
var subject = new ReplaySubject<string>(bufferSize);
subject.OnNext("a");
subject.OnNext("b");
subject.OnNext("c");
subject.Subscribe(Console.WriteLine);
subject.OnNext("d");
}
因此,通过这种方式,您可以控制要重播的项目数。 来源ReplaySubject