我正在编写一个程序,该程序需要动态地从事件源附加/分离事件处理程序。 这种情况发生了很多次,我不希望由于附加/分离而造成任何消息丢失或重复。
但是似乎我在这里做错了事以分离合并订户。
import Foundation
import Combine
let a = PassthroughSubject<String,Never>()
var b = a
.buffer(size: .max, prefetch: .byRequest, whenFull: .customError({ fatalError() }))
.receive(on: DispatchQueue.main)
.sink(receiveValue: { print($0) })
a.send("AAA")
b.cancel()
a.send("BBB")
b = a
.buffer(size: .max, prefetch: .byRequest, whenFull: .customError({ fatalError() }))
.receive(on: DispatchQueue.main)
.sink(receiveValue: { print($0) })
a.send("CCC")
RunLoop.main.run()
这会打印出来。
AAA
BBB
CCC
CCC
CCC
被复制,BBB
是意外的。似乎取消b
并不会使其脱离源a
。看来我做这些事情完全是错的。
从主题附加/分离订阅者的正确方法是什么?在这种情况下,我想动态地将b
从a
附加/分离。