Ios 在联合收割机中将给定的发布服务器故障类型设置为“从不”

Ios 在联合收割机中将给定的发布服务器故障类型设置为“从不”,ios,swift,frp,combine,Ios,Swift,Frp,Combine,是否有一种方法可以将给定的AnyPublisher转换为AnyPublisher?将Never作为错误类型的发布者意味着它根本不能抛出错误。它总是能带来价值 要获得一个永远不会抛出错误的发布者,您有两种解决方案: 1/捕获所有可能的错误: let publisher:AnyPublisher=/。。。 publisher.catch{中出现错误 //在此处处理错误。“catch”运算符需要 //作为发布者返回“回退值” 仅返回(//*…*/)//作为示例 } 2/如果您确定发布服务器不会抛出错

是否有一种方法可以将给定的
AnyPublisher
转换为
AnyPublisher

Never
作为错误类型的发布者意味着它根本不能抛出错误。它总是能带来价值

要获得一个永远不会抛出错误的发布者,您有两种解决方案:

1/捕获所有可能的错误:

let publisher:AnyPublisher=/。。。
publisher.catch{中出现错误
//在此处处理错误。“catch”运算符需要
//作为发布者返回“回退值”
仅返回(//*…*/)//作为示例
}

2/如果您确定发布服务器不会抛出错误,则可以使用将转换发布服务器的
.assertNoFailure()
。请注意,如果通过
.assertNoFailure()
传递错误,您的应用程序将立即崩溃。

请使用
replaceError
操作符。这要求您发出一个AnyType值,如果上游出现错误,该值将从此点沿管道向下发送

例如:

URLSession.shared.dataTaskPublisher(for: url)
    .map {$0.data} // *
    .replaceError(with: Data()) // *
    // ...

从这一点开始,我们就可以保证接收到来自数据任务完成的数据或(如果存在网络错误)空数据。从这一点开始,管道中的故障类型永远不会发生。

啊,我不知道
assertNoFailure
。谢谢大家!@rraphael它不起作用,因为catch将(也就是太)立即完成publisher。对于作者的问题,没有通用的解决方案。我有一段时间没有使用
catch
,但我似乎记得
catch
确实完成了发布程序(以防它捕捉到错误),但用一个新的发布程序替换发布程序(这里
只是
)。因此,在
catch
之后,确实有一个发布者将
Never
作为错误类型(并且您将在接收器或分配中使用
Just
提供的值)。