Swift 联合收割机中的可重用发布服务器(订阅?)

Swift 联合收割机中的可重用发布服务器(订阅?),swift,combine,Swift,Combine,我有一个例子,我使用了一个dataTaskPublisher,然后链接输出,如下所示。现在,我正在使用URLSession的downloadTask(with:completionHandler)实现后台下载,我需要执行完全相同的操作 因此,下面代码中的所有内容,从解码(type:decoder)开始,在这两种情况下都是通用的。是否有某种方法可以获取数据对象,让它通过相同的步骤集而不复制代码 anycancelable=session.dataTaskPublisher(for:url) .ma

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

因此,下面代码中的所有内容,从
解码(type:decoder)
开始,在这两种情况下都是通用的。是否有某种方法可以获取
数据
对象,让它通过相同的步骤集而不复制代码

anycancelable=session.dataTaskPublisher(for:url)
.map{$0.data}
.decode(类型:TideLowWaterHeightPredictions.self,解码器:self.decoder)
.map{$0.0}
.删除任何发布者()
.水槽{
...
}receiveValue:{中的预测
...
}

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

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)
或者,如果您已经有一个
数据

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

当然可以,但是你需要把管道分成两部分。你能举个例子吗?正是我需要的,谢谢@mattCool!很乐意帮忙。