본문 바로가기

Swift/Combine

Divide Stream with "FlatMap"

처음 Combine을 공부할 때 map과 flatMap의 차이점을 공감할 수 없었습니다.

단순히 [String] -> String으로 flat하게 만들어주는 메소드로 이해했습니다.

하지만 이 친구는 생각보다 더 많은 일을 할 수 있는 친구였습니다.

오늘은 비동기적인 작업을 처리할 때 큰 힘이 될 flatMap에 대해서 소개하도록 하겠습니다.

 

func flatMap<P>(
maxPublishers: Subscribers.Demand = .unlimited,
_ transform: @escaping (Self.Output) -> P
) -> Publishers.FlatMap<P, Self> where P : Publisher, P.Failure == Never

파라미터 인자중에  transform을 보게 되면 새로운 Publisher를 리턴하도록 되어 있습니다.

이 말은 즉 데이터를 "비동기적"으로 반환할 수 있다는 말입니다.

 

조금 더 구체적인 상황으로 보자면, URL 배열을 동기적으로 모든 데이터를 요청하고 데이터를 받기엔 많은 시간이 걸립니다.  

이 문제를 flatMap을 사용한다면 코드가 선언적으로 변경되는 걸 확인하실 수 있을 겁니다.

메소드의 시작은 AnyPublisher<[URL], Never> 지만,

flatMap을 통해서 AnyPublisher<Data, Never>로 바뀐 걸 확인하실 수 있을 겁니다.

마지막에 AnyPublisher<Data, Never>입니다