组合中的可重用发布者(订阅?)

Posted

技术标签:

【中文标题】组合中的可重用发布者(订阅?)【英文标题】:Reusable publishers (subscriptions?) in Combine 【发布时间】:2021-05-30 20:48:08 【问题描述】:

我有一个案例,我使用 dataTaskPublisher 然后链接输出,如下所示。现在我正在使用URLSessiondownloadTask(with:completionHandler) 实现后台下载,我需要执行完全相同的操作。

所以下面代码中的所有内容,从decode(type:decoder) 开始,在这两种情况下都是通用的。有什么方法可以让Data 对象在不复制代码的情况下通过同一组步骤?

anyCancellable = session.dataTaskPublisher(for: url)
  .map  $0.data 
  .decode(type: TideLowWaterHeightPredictions.self, decoder: Self.decoder)
  .map  $0.predictions 
  .eraseToAnyPublisher()
  .sink 
    ...
   receiveValue:  predictions in
    ...
  

【问题讨论】:

可以,但是您需要将管道分成两部分。 你能举个例子吗? ***.com/a/66056209/341994 正是我需要的,谢谢@matt 酷!很高兴为您提供帮助。 【参考方案1】:

您可以将其包装在扩展中:

extension Publisher where Output == Data 
    func gargoyle() -> AnyCancellable 
        return self
            .decode(type: TideLowWaterHeightPredictions.self, decoder: Self.decoder)
            .map  $0.predictions 
            .sink 
                ...
             receiveValue:  predictions in
                ...
            
    

并像这样使用它:

session
    .dataTaskPublisher(for: url)
    .map  $0.data 
    .gargoyle()
    .store(in: &tickets)

如果你已经有Data,或者像这样:

Just(data)
    .gargoyle()
    .store(in: &tickets)

【讨论】:

以上是关于组合中的可重用发布者(订阅?)的主要内容,如果未能解决你的问题,请参考以下文章

List 中的可重用性支持 - SwiftUI

QML中的可重用字体属性[重复]

Eclipse/Android 中的可重用项目

React 中的可重用组件

UITableView 单元格中的可重用单元格存在问题

SQL Server 架构集合中的可重用 simpleType 定义