티스토리 뷰
오늘은 iOS Combine framework operator 연산자 중, 여러 Publisher이벤트를 시간순으로 합져서 받기 위해 사용할 수 있는 merge(with:)에 대해서 예제와 함께 다뤄보겠습니다. 😁
iOS Combine, Publisher들의 이벤트를 merge 할때 사용하는 merge(with:)
공식 문서의 예시 참고하여 알아보기
merge(with:) 연산자는 인자로 Publisher를 받습니다. 그렇게 A, B Publisher가 있다고 할때, A.merge(with: B) 와 같이 될 수 있는 것인데요. 이렇게 되면, 하나의 stream을 통해 A, B가 방출하는 이벤트를 시간순으로 함께 받을 수 있게 됩니다.
그 아래 merge(with) 과 관련된 공식 문서에 나온 예시를 보도록 하겠습니다.
PassthroughSubject<Int, Never>() 타입의 publisher, pub2 를 선언했습니다. 이후에 merge(with:) 을 사용하고 있죠. 여기에서 publisher, pub2 두개 publisher의 이벤트를 down stream에서 함께 받을 수 있습니다.
그렇기에, publisher, pub2 subject(publisher)들이 send를 통해 방출되는 이벤트가 cancellable에서 저장한 구독을 통해 수신되는 것을 볼 수 있습니다.
위의 경우에는 subject와 subject를 merge한 예시인데요. subject가 아닌 일반 publisher를 merge할 수도 있습니다. 아래 예시로 한번더 보겠습니다.
iOS Combine, merge(with:) operator의 또다른 사용 예시, 방법 알아보기
merge(with:) 사용하기 전에 그 안에 사용되는 메서드 하나를 보겠습니다. Int 인자를 받아서 String 이벤트를 방출하는 AnyPublisher를 반환하는 메서드입니다. Just Publisher는 단 하나의 원소를 down stream으로 전달하며 Error를 던지지 않습니다.
결과적으로, stream이 내려가면서 Just<Int> -> Just<String> -> AnyPublisher<String, Never> 타입 Publisher로 변환하여 반환됩니다.
merge(with:)이 사용되는 예제 메서드입니다. 1...100 까지의 100개 원소를 가진 배열에서 (1...50)의 원소만 추려낸 후, [Int] 타입 배열의 각 원소를 String 타입으로 변환 하여 Publisher 이벤트로 방출합니다.
이때 merge(with:) 연산자를 사용해서 1부터 50까지 차례대로 이벤트를 합친 후, down stream에 내려주는 AnyPublisher<String, Never> 타입 Publisher를 반환하게 됩니다.
* 다수의 원소를 갖는 배열의 경우에는 보통 reduce의 결과로 배열타입을 반환하며, [String], [Int] 타입을 반환하곤 합니다.
하지만 위 예시처럼 Combine Publisher를 merge한 결과에 대하여 반환타입을 AnyPublisher<String, Never>로 받고 있는데, 이때는 Output 타입이 [String]이 아닌 String이 됩니다. 내부 연산과정을 숨기는 AnyPublisher를 반환하면 내부 연산과정에 따라 다수의 이벤트를 방출할 수 있습니다.
해당 메서드를 구독할 경우, "1", "2", .... "50" 의 String 타입 Output을 받게 될 것입니다.
앞서 보았던 메서드를 구독한 결과입니다. 예상대로 "1", "2", .... "50" 의 String 타입 Output을 받게 됩니다.
iOS Combine framework에서 사용하는 merge operator는 다수의 Publisher의 이벤트를 하나의 stream으로 받고자 할때, 그렇게 여러 Publisher로부터 받는 이벤트를 시간순으로 받고자 할때 유용하게 사용될 수 있는 연산자입니다.
기타 의견이나 피드백 언제든 댓글로 부탁드립니다. 아래 위 예제 코드가 있는 참고링크 공유드립니다. 감사합니다!
'iOS 개발 > SwiftUI, Combine' 카테고리의 다른 글
SwiftUI와 MainActor, View와 async await 기능 메인스레드 동작 여부 (0) | 2023.04.10 |
---|---|
SwiftUI, PreferenceKey protocol 부모뷰에서 자식뷰 설정값 관리방법 (0) | 2023.03.23 |
iOS Font Asset 추가 및 SwiftUI Text View 폰트 적용 방법 (0) | 2023.01.10 |
Combine type erasure, eraseToAnyPublisher 역할 및 사용이점 (2) | 2022.12.11 |
iOS Combine, Publisher로 UIButton, UIView 이벤트 처리방법 (1) | 2022.11.14 |
- Total
- Today
- Yesterday
- 스위프트
- Protocol
- 김프매매
- 프로토콜
- Collection
- swift알고리즘
- swift reduce
- swift언어
- 자연어처리
- 프로그래머스
- 개발자문서
- 백준알고리즘
- swift string
- 알고리즘문제
- publisher
- swift문제
- CoreML
- 알고리즘
- 컬렉션
- 부스트코스
- Swift 알고리즘
- 프로그래머스swift
- ios
- swift 문자열
- uikit
- createML
- swift
- SwiftUI
- swift 기초
- 백준swift
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |