关于eraseToAnyPublisher()
,先看一下官方给出的定义:
Wraps this publisher with a type eraser.
其定义如下:
func eraseToAnyPublisher() -> AnyPublisher<Self.Output, Self.Failure>
该方法返回了AnyPublisher
类型。
官方的介绍是:
使用
eraseToAnyPublisher()
将AnyPublisher
的实例公开给下游订阅者,而不是该发布者的实际类型。这种形式的类型擦除保留了跨API边界的抽象,比如不同的模块。当你将发布者公开为AnyPublisher
类型时,你可以随时更改底层实现,而不会影响现有客户端。
说的通俗点就是使用了eraseToAnyPublisher()
方法,就会将上游传下来的具体类型的Publisher
转化成AnyPublisher
,该方法下游的Subscriber
接收到的就是AnyPublisher
了。
AnyPublisher介绍
A publisher that performs type erasure by wrapping another publisher.
通过类型擦除技术来包装另一个Publisher
的Publisher
。
AnyPublisher
自己没有重要的属性,只是传递上游传递过来的值或者Completion回调。
使用AnyPublisher
包装一个不公开的详细信息的Publisher
,例如不同的模块。用AnyPublisher
包装还可以防止调用者访问send(_:)
方法。当以这种方式使用类型擦除时,可以随时间更改底层发布者实现,而不会影响现有客户端。
什么时候用AnyPublisher
了解了AnyPublisher
,那么具体什么时候会用eraseToAnyPublisher()
把具体的Publisher
转换成AnyPublisher
呢?
1. 需要保护一些私有信息
AnyPublisher
的一个引人注目的用例是保护数据流的私有详细信息。
class A