【发布时间】:2020-11-03 05:07:09
【问题描述】:
假设我有一个类的 API,它使用 PassthroughSubject 接收其输入:
class Logger {
let log: PassthroughSubject<String, Never>
}
通常我可以通过调用 logger.log.send("test") 来发出一个值。
现在假设我想拥有一个位于通用记录器和我的代码之间的记录器:
class MyLogger {
let log: PassthroughSubject<String, Never>
}
这应该作为字符串的前缀,然后将任何更新发送到 Logger。有没有办法将输出从一个 PassthroughSubject(例如 MyLogger)链接到另一个(例如 Logger)?
我知道我可以这样做:
let cancellable = myLogger.log.sink {
logger.log.send("[MyApp] " + $0)
}
但是,这似乎不像是将事物链接在一起的组合方式。我希望有一个我可以使用的 API 更类似于这个:
logger.log.subscribe(myLogger.log.map { "[MyApp] " + $0 })
但是,这并没有编译,因为我认为地图导致它变成了发布者而不是主题:
实例方法 'subscribe' 要求 'Publishers.Map
, String>' 符合 'Subject'
除了依赖 sink 之外,是否有一种更具声明性的 API 可以让一个 PassthroughSubject 订阅来自另一个的更新(支持中间的突变)?
【问题讨论】: