Search

flatMap

사용 용도

여러개의 upstream 퍼블리셔 → 하나의 downstream 퍼블리셔
하나의 퍼블리서에 의해서 발행된 원소들을 퍼블리셔를 리턴하는 메서드에 건네주어서, 리턴된 퍼블리셔를 구독하기위해 사용.
collect → 어레이→ 전처리 → 하나의 처리된 값
example(of: "flatMap") { // 1 func decode(_ codes: [Int]) -> AnyPublisher<String, Never> { Just( codes .compactMap { code in guard (32...255).contains(code) else { return nil } return String(UnicodeScalar(code) ?? " ") } .joined() ) .eraseToAnyPublisher() } }
Swift
복사
1.
원하는 타입의 Publisher를 리턴하는 함수를 정의해준다.
파라미터 : upstream 에서 발행되는 값의 타입
리턴타입 : downstream 으로 내려줄 퍼블리셔 타입
위 예제에서는 String 타입으로 mapping 을 시도하고 있다.
[72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33] .publisher .collect() .flatMap(decode) // 각각의 decode 는 13개의 퍼블리셔를 리턴하게 되는데 fla .sink(receiveValue: { print($0) }) .store(in: &subscriptions) ——— 결과 ——— Hello, World
Swift
복사
2.
flatMap 에 해당 함수를 넣어준다.
flatMap의 경우 건네받은 모든 퍼블리셔의 결과물들을 납작하게 만들어 하나의 퍼블리셔로 만든다.
많은 퍼블리셔를 하나의 퍼블리셔로 flatMap 하게 되면 메모리 걱정이될 수 밖에 없다. ( 모든 결과물을 buffering 하기 때문 )
어떻게 관리하면 좋을까?
하나의 퍼블리셔로 매핑할 퍼블리셔의 최대개수를 지정해주면 된다.