사용 용도
•
여러개의 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 하기 때문 )
어떻게 관리하면 좋을까?
하나의 퍼블리셔로 매핑할 퍼블리셔의 최대개수를 지정해주면 된다.