Swift 如何调整联合收割机&x27;没有自定义订阅者的发布者需求?

Swift 如何调整联合收割机&x27;没有自定义订阅者的发布者需求?,swift,reactive-programming,combine,Swift,Reactive Programming,Combine,在这个框架中,有一个a的概念,它允许向用户发送背压信号 假设我有一个简单的出版商: let number=publisher.Sequence(序列:0…100) 我想下载某些使用这些数字作为参数的URL。我还想下一次下载开始后,才上一次下载已经完成 然后,一种天真的方法将如下所示: let subscription=numbers.sink(receiveCompletion:{in},receiveValue:{ 让url=url(字符串:https://httpbin.org/get?v

在这个框架中,有一个a的概念,它允许向用户发送背压信号

假设我有一个简单的出版商:

let number=publisher.Sequence(序列:0…100)
我想下载某些使用这些数字作为参数的URL。我还想下一次下载开始后,才上一次下载已经完成

然后,一种天真的方法将如下所示:

let subscription=numbers.sink(receiveCompletion:{in},receiveValue:{
让url=url(字符串:https://httpbin.org/get?value=\($0)")!
URLSession.shared.dataTask(带:url){
$0.map{print(字符串(数据:$0,编码:.utf8)!)
}1.简历()
})
不幸的是,这不能满足在开始下一次下载之前等待上一次下载完成的要求。据我所知,
sink
函数将返回类型为的值,而不是类型为的值。如果是后一种情况,我们可以在上传完成后调用
订阅
上的函数,并发出特定的请求

控制由
sink
或任何其他标准组合
Subscriber
提供的订阅需求的最佳方法是什么?

结果是,运营商采用了一个附加的
maxpublisher
参数,该参数采用一个值。与发布服务器结合使用,这允许
数字
发布服务器在发送下一个值之前等待,直到将来能够处理给定的值

将此应用于原始代码,一个接一个地下载值将如下所示:

enum下载错误:错误{
野田案例
}
let subscription=numbers.flatMap(maxPublishers:.max(1)){number in
未来{
让url=url(字符串:https://httpbin.org/get?value=\(数字)“)!
URLSession.shared.dataTask(带:url){
交换机($0,$2){
案例编号(数据?,无):
承诺(.success(数据))
案例let(无,错误?):
承诺(失败(错误))
违约:
承诺(.failure(DownloadError.noData))
}
}1.简历()
}
}.水槽(
receiveCompletion:{打印中(“此处应处理错误”)},
receiveValue:{print(字符串(数据:$0,编码:.utf8)!)}
)

就我个人而言,我觉得最好在一个操作中处理它(以前称为
NSOperation
),您可以添加对相同类型的正在进行的操作的依赖关系。它还将封装大部分代码,并可能返回一个
结果
,该结果可由
未来处理
我知道还有其他方法来实现这一点,但我的问题是关于Combine及其API的。令人费解的是,支持背压被宣传为联合收割机的一个显著特征,但对于一个普遍的需求,并没有一个简单的解决方案可以用背压来解决。