假设我有一个使用PassthroughSubject
接收其输入的类的API:
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 })
但是,这并不能编译,因为我认为地图正导致它变成一个出版商,而不是主题:
实例方法“订阅”要求“Publishers.Map、String>”符合“Subject”
除了依赖于PassthroughSubject之外,是否有更多的声明性API使一个sink
订阅来自另一个sink
的更新(在两者之间支持突变)?
发布于 2020-07-13 16:08:30
如果您翻转订阅的顺序,它会工作:
let cancellable = myLogger.log
.map { "[MyApp] " + $0 }
.subscribe(logger.log)
myLogger.send("test") // will send "[MyApp] test" to logger.log
话虽如此,用组合来建模这样的集合API似乎有点奇怪,而且Failure
数据类型似乎完全被忽略了。如果日志失败了,就无法从链上进行通信,因为它失败了。
一个更好的API可能是一个普通函数,它返回一个AnyPublisher
。
class Logger {
func log(_ string: String) -> AnyPublisher<Void, Never>
}
class MyLogger {
func log(_ string: String) -> AnyPublisher<Void, Never> {
return logger.log(string)
}
}
https://stackoverflow.com/questions/62885416
复制相似问题