forget.jpeg

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로 추상화 시켜야 해요.