首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将呼叫从一个PassthroughSubject转发到另一个(即PassthroughSubject链)?

如何将呼叫从一个PassthroughSubject转发到另一个(即PassthroughSubject链)?
EN

Stack Overflow用户
提问于 2020-07-13 14:43:48
回答 1查看 463关注 0票数 0

假设我有一个使用PassthroughSubject接收其输入的类的API:

代码语言:javascript
运行
AI代码解释
复制
class Logger {
  let log: PassthroughSubject<String, Never>
}

通常,我可以通过调用logger.log.send("test")来发出一个值。

现在假设我想拥有自己的记录器,它位于这个通用记录器和我的代码之间:

代码语言:javascript
运行
AI代码解释
复制
class MyLogger {
  let log: PassthroughSubject<String, Never>
}

这应该是字符串的前缀,然后向Logger发送任何更新。有没有办法将输出从一个PassthroughSubject (例如MyLogger)链接到另一个(例如Logger)?

我知道我可以这样做:

代码语言:javascript
运行
AI代码解释
复制
let cancellable = myLogger.log.sink { 
  logger.log.send("[MyApp] " + $0)
}

然而,这似乎不像是把事情联系在一起的结合方式。我希望有一个API,我可以使用更类似于这个:

代码语言:javascript
运行
AI代码解释
复制
logger.log.subscribe(myLogger.log.map { "[MyApp] " + $0 })

但是,这并不能编译,因为我认为地图正导致它变成一个出版商,而不是主题:

实例方法“订阅”要求“Publishers.Map、String>”符合“Subject”

除了依赖于PassthroughSubject之外,是否有更多的声明性API使一个sink订阅来自另一个sink的更新(在两者之间支持突变)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-13 16:08:30

如果您翻转订阅的顺序,它会工作:

代码语言:javascript
运行
AI代码解释
复制
let cancellable = myLogger.log
  .map { "[MyApp] " + $0 }
  .subscribe(logger.log)

myLogger.send("test") // will send "[MyApp] test" to logger.log

话虽如此,用组合来建模这样的集合API似乎有点奇怪,而且Failure数据类型似乎完全被忽略了。如果日志失败了,就无法从链上进行通信,因为它失败了。

一个更好的API可能是一个普通函数,它返回一个AnyPublisher

代码语言:javascript
运行
AI代码解释
复制
class Logger {
  func log(_ string: String) -> AnyPublisher<Void, Never>
}

class MyLogger {
  func log(_ string: String) -> AnyPublisher<Void, Never> {
    return logger.log(string)
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62885416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文