본문 바로가기

난 iOS개발자/Combine

eraseToAnyPublisher

728x90
eraseToAnyPublisherPublisher프로토콜을 구현하는 타입에서 호출, 해당 Publisher의 타입을 숨기고 AnyPublisher 타입으로 변환합니다.
 

이 변환을 통해 Publisher의 구체적인 타입정보를 숨기고 API설계 단순화에 도움이됩니다.

 

func fetchData(url: URL) -> AnyPublisher<Data, Error> {
    URLSession.shared.dataTaskPublisher(for: url)
        .map { $0.data }
        .eraseToAnyPublisher()
}

fetchData함수는 URL을 인수로 받아 데이터를 요청하고 결과를 반환하는 역할입니다. API요청을 수행하고 map연산자를 사용하여 데이터만 추출합니다. 그리고 eraseToAnyPublisher메서드를 호출하여 publisher타입을 AnyPublisher<Data, Error>로 변환합니다. 이렇게하면 함수의 반환타입이 간결해지고 명확해집니다.

 

 

또 다른 예시를 보겠습니다.

let x = PassthroughSubject<String, Never>()
    .flatMap { name in
        return Future<String, Error> { promise in
            promise(.success(""))
            }.catch { _ in
                Just("No user found")
            }.map { result in
                return "\(result) foo"
        }
}

 

만약 타입으로 x를 받는다면 x의 타입은 어떻게 될까요? 다수의 연산이 이뤄졌기 때문에 아래와 같습니다.

 

Publishers.FlatMap<Publishers.Map<Publishers.Catch<Future<String, Error>, Just<String>>, String>, PassthroughSubject<String, Never>>

 

타입이 너무 길고 개발자 입장에서 파이프라인이 어떤 흐름으로 연결되는지 불필요하게 외부로 노출시키게 됩니다. 중요한건 결과입니다.

마찬가지로 eraseToAnyPublisher 로 지워줍니다.

 

let x = PassthroughSubject<String, Never>()
//////////생략
}.eraseToAnyPublisher()

 

이제 x 는 간단히 AnyPublisher<String, Never> 타입이 됩니다.

Operation에서의 데이터를 처리할 땐 Operation 상호 간 에러 처리나 혹은 스트림 제어를 위해서 데이터 형식을 알아야 하지만 Subscrbier에게 전달될 땐 필요가 없게 됩니다.

따라서 최종적인 형태로 데이터를 전달할 땐 eraseToAnyPublisher를 사용하게 됩니다.

728x90

'난 iOS개발자 > Combine' 카테고리의 다른 글

Combine 변환연산자  (0) 2023.04.02
Combine01 개요  (0) 2022.10.17