Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- combine
- swift documentation
- 애니메이션
- Observable
- SWIFT
- UITextView
- collectionview
- map
- 리펙터링
- Xcode
- uitableview
- HIG
- 리팩토링
- 클린 코드
- 리펙토링
- ios
- Human interface guide
- RxCocoa
- rxswift
- Clean Code
- MVVM
- tableView
- uiscrollview
- 스위프트
- UICollectionView
- clean architecture
- Refactoring
- ribs
- Protocol
- swiftUI
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - SwiftUI] Combine Combining 연산자 (combineLatest, merge, zip) 본문
iOS Combine (SwiftUI)
[iOS - SwiftUI] Combine Combining 연산자 (combineLatest, merge, zip)
jake-kim 2022. 11. 14. 22:34목차) Combine - 목차 링크
Combining 연산자
* 스트림에서 방출되는 2개 이상의 요소들을 묶어서 방출하는 방법
예제에 사용할 스트림 2개 준비)
- PassthroughSubject는 downstream subscribers에게 값을 broadcast하는 subject
- 값을 저장하고 있지는 않고 단순히 값을 토스 해주는 역할
- RxSwift의 PublishSubject와 동일
- (구체적인 개념은 이전 포스팅 글 참고)
let passthroughSubject1 = PassthroughSubject<String, Never>()
let passthroughSubject2 = PassthroughSubject<String, Never>()
- combineLatest(_:_:)
- 두 스트림 모두 메시지를 받았을때 이벤트 방출
- 해당 연산자에서 이전 값을 기억하고 있으며, sub1에서 이벤트가 발생했을때, sub2의 이전 이벤트가 남아있다면 그 이벤트와 같이 방출
let cancellable1 = passthroughSubject1
.combineLatest(passthroughSubject2) { sub1, sub2 in
return sub1 + sub2
}
.sink(receiveValue: { print($0) })
passthroughSubject1.send("test1")
passthroughSubject2.send("test2")
// test1test2
// 이전 이벤트 기억: sub1만 방출했는데도, sub2의 이전 이벤트와 같이 방출
passthroughSubject1.send("test1") // test1test2
- merge(with:)
- 두 스트림을 묶어서 각각 방출하는 것들을 묶어서 하나의 sink(receiveValue:)에서 받을 수 있는 연산자
let cancellable2 = passthroughSubject1
.merge(with: passthroughSubject2)
.sink(receiveValue: { print($0) })
passthroughSubject1.send("test1")
//test1
passthroughSubject2.send("test2")
//test2
- zip()
- 두 이벤트가 반드시 하나씩 방출했을때 결과를 튜플로 방출해주는 연산자
- combineLatest와 유사하지만, zip은 이전 이벤트를 기억하지 않고, 반드시 두 이벤트가 방출되어야 동작
let cancellable3 = passthroughSubject1
.zip(passthroughSubject2)
.sink(receiveValue: { print($0) })
passthroughSubject1.send("test1")
passthroughSubject2.send("test2")
// ("test1", "test2")
passthroughSubject1.send("test1")
// 출력x - sub2도 방출해야 출력됨
'iOS Combine (SwiftUI)' 카테고리의 다른 글
Comments