AnyPublisher는 프로토콜 Publisher을 준수하는 어떤 Publisher를 추상화하여 해당 Publisher의 구체 타입을 소거하는 Publisher 입니다.
func fetchData() -> AnyPublisher<Data, Error> {
URLSession.shared.dataTaskPublisher(for: URL(string: "<https://example.com>")!)
.map { $0.data }
.mapError { $0 as Error }
.eraseToAnyPublisher() // URLSession의 Publisher를 AnyPublisher로 타입 소거
}
fetchData()
.sink { completion in
switch completion {
case .finished:
print("finished")
case .failure(let error):
print("error: \\(error)")
}
} receiveValue: { value in
print(value)
}
.store(in: &cancellables)
URLSession의 dataTaskPublisher을 사용하면 URLSession.DataTaskPublisher
타입의 Publisher가 리턴돼요.
public func dataTaskPublisher(for url: URL) -> URLSession.DataTaskPublisher
이후 map 과 mapError을 Operator을 사용하여 dataTaskPublisher의 Output과 Failure을 가져오고, eraseToAnyPublisher을 통해 AnyPublisher 로 래핑하는 코드에요.
물론 타입소거 없이 그대로 사용하는 방법도 있어요
func fetchData() -> URLSession.DataTaskPublisher {
URLSession.shared.dataTaskPublisher(for: URL(string: "<https://example.com>")!)
}
하지만 이후 다른 Publisher와 상호작용 해야하는 상황이 발생한다면 구체타입을 더 이상 사용할 수 없으므로 AnyPublisher로 추상화 시켜야 해요.