728x90
eraseToAnyPublisher는 Publisher프로토콜을 구현하는 타입에서 호출, 해당 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 |