Publishers.CombineLatest
์ ๋ค๋ฆญ ๊ตฌ์กฐ์ฒด | ๋ ๊ฐ์ Publisher๋ก๋ถํฐ ์ต์ ์ ์์๋ฅผ ์ ๋ฌ๋ฐ๊ณ ์กฐํฉํ๋ Publisher
์ด๋์ ๋ผ์ด์ ๋ ์กฐํฉํ ๋ ๊ฐ์ Publisher๋ฅผ ๋ฐ๋๋ค.
์กฐํฉํ ๋ชจ๋ Publisher์ ์๋ฌ ํ์ ์ ๊ฐ์์ผ ํ๋ค.
๋ ๊ฐ์ Publisher์์ ์ต์ ์ ์์๋ฅผ ๋ฐํํ์ ๋ ์ด๋ค์ ์กฐํฉํ๋ ๋์์ ์ํ ๋ ์ฌ์ฉํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๋ ๊ฐ์ ์ ๋ ฅ ํผ์ด ์๊ณ ๋ชจ๋ ๊ฐ์ด ์ ๋ ฅ๋์ด์ผ ๋ฒํผ์ ํ์ฑํํด์ผ ํ๋ค๋ ์๊ตฌ์ฌํญ์ด ์์ ๋ ์ด ๋์์ ์ฌ์ฉํ ์ ์๋ค. ๋ ๊ฐ์ ์ ๋ ฅ์ ๋ํ Publisher์์ ๋ชจ๋ ๊ฐ์ ๋ฐํํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
comnbineLatest
์คํผ๋ ์ดํฐ์ ๊ด๋ จ์ด ์๋ค.
let aSubject = PassthroughSubject<Int, Never>()
let bSubject = PassthroughSubject<Int, Never>()
// Publishers.CombineLatest Publisher
Publishers
.CombineLatest(aSubject, bSubject)
.sink(receiveCompletion: { completion in
switch completion {
case .failure:
print("Combine CombineLatest Error")
case .finished:
print("Combine CombineLatest Finish")
}
}, receiveValue: { value in
print("Combine CombineLatest : \(value)")
})
.store(in: &cancellables)
// Combine CombineLatest : (2, 3)
// Combine CombineLatest : (2, 4)
// Combine CombineLatest Finish
// combineLatest Operator
aSubject
.combineLatest(bSubject)
.sink(receiveCompletion: { completion in
switch completion {
case .failure:
print("Combine CombineLatest Error")
case .finished:
print("Combine CombineLatest Finish")
}
}, receiveValue: { value in
print("Combine CombineLatest : \(value)")
})
.store(in: &cancellables)
// Combine CombineLatest : (2, 3)
// Combine CombineLatest : (2, 4)
// Combine CombineLatest Finish
aSubject
.combineLatest(bSubject) { $0 * $1 }
.sink(receiveCompletion: { completion in
switch completion {
case .failure:
print("Combine CombineLatest Error")
case .finished:
print("Combine CombineLatest Finish")
}
}, receiveValue: { value in
print("Combine CombineLatest : \(value)")
})
.store(in: &cancellables)
// Combine CombineLatest : 6
// Combine CombineLatest : 8
// Combine CombineLatest Finish
// 1
aSubject.send(1)
// 2
aSubject.send(2)
// 3
bSubject.send(3)
// 4
bSubject.send(4)
๋ ๊ฐ์ Subject๋ก๋ถํฐ ์ต์ ์ ์์๋ฅผ ์ ๋ฌ๋ฐ๊ณ ์กฐํฉํ๋๋ก ํ์๋ค.
๋ณํ ํด๋ก์ ๋ฅผ ์ ์ฉํ์ง ์์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค.
1์ ์คํ์ ์ํด
aSubject
์ 1์ ๊ฐ์ ์ ๋ฌํ๋ค.bSubject
์ ๊ฐ์ด ์ ๋ฌ๋ ์ ์ด ์์ผ๋ฏ๋ก ํด๋น Publisher๋ ๊ฐ์ ๋ด์ง ์๋๋ค.2์ ์คํ์ ์ํด
aSubject
์ 2์ ๊ฐ์ ์ ๋ฌํ๋ค.bSubject
์ ๊ฐ์ด ์ ๋ฌ๋ ์ ์ด ์์ผ๋ฏ๋ก ํด๋น Publisher๋ ๊ฐ์ ๋ด์ง ์๋๋ค.3์ ์คํ์ ์ํด
bSubject
์ 3์ ๊ฐ์ ์ ๋ฌํ๋ค.aSubject
์ ๊ฐ์ด ์ ๋ฌ๋ ์ ์ด ์์ผ๋ฏ๋ก ํด๋น Publisher๋aSubject
์ ์ต์ ๊ฐ์ธ 2์bSubject
์ ์ต์ ๊ฐ์ธ 3์ ํํ์ ํํ๋ก ์กฐํฉํ์ฌ (2, 3)์ ๊ฐ์ ๋ธ๋ค.4์ ์คํ์ ์ํด
bSubject
์ 4์ ๊ฐ์ ์ ๋ฌํ๋ค.aSubject
์ ๊ฐ์ด ์ ๋ฌ๋ ์ ์ด ์์ผ๋ฏ๋ก ํด๋น Publisher๋aSubject
์ ์ต์ ๊ฐ์ธ 2์bSubject
์ ์ต์ ๊ฐ์ธ 4๋ฅผ ํํ์ ํํ๋ก ์กฐํฉํ์ฌ (2, 4)์ ๊ฐ์ ๋ธ๋ค.
๋ณํ ํด๋ก์ ๋ฅผ ์ ์ฉํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค.
1์ ์คํ์ ์ํด
aSubject
์ 1์ ๊ฐ์ ์ ๋ฌํ๋ค.bSubject
์ ๊ฐ์ด ์ ๋ฌ๋ ์ ์ด ์์ผ๋ฏ๋ก ํด๋น Publisher๋ ๊ฐ์ ๋ด์ง ์๋๋ค.2์ ์คํ์ ์ํด
aSubject
์ 2์ ๊ฐ์ ์ ๋ฌํ๋ค.bSubject
์ ๊ฐ์ด ์ ๋ฌ๋ ์ ์ด ์์ผ๋ฏ๋ก ํด๋น Publisher๋ ๊ฐ์ ๋ด์ง ์๋๋ค.3์ ์คํ์ ์ํด
bSunject
์ 3์ ๊ฐ์ ์ ๋ฌํ๋ค.aSubject
์ ๊ฐ์ด ์ ๋ฌ๋ ์ ์ด ์์ผ๋ฏ๋ก ํด๋น Publisher๋aSubject
์ ์ต์ ๊ฐ์ธ 2์bSubject
์ ์ต์ ๊ฐ์ธ 3์ ๊ณฑํ์ฌ 6์ ๊ฐ์ ๋ธ๋ค.4์ ์คํ์ ์ํด
bSunject
์ 4์ ๊ฐ์ ์ ๋ฌํ๋ค.aSubject
์ ๊ฐ์ด ์ ๋ฌ๋ ์ ์ด ์์ผ๋ฏ๋ก ํด๋น Publisher๋aSubject
์ ์ต์ ๊ฐ์ธ 2์bSubject
์ ์ต์ ๊ฐ์ธ 4๋ฅผ ๊ณฑํ์ฌ 8์ ๊ฐ์ ๋ธ๋ค.
RxSwift
combineLatest
์คํผ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์๋ค.
let aSubject = PublishSubject<Int>()
let bSubject = PublishSubject<Int>()
Observable.combineLatest(aSubject, bSubject)
.subscribe(onNext: { value in
print("RxSwift CombineLatest : \(value)")
}, onError: { _ in
print("RxSwift CombineLatest Error")
}, onCompleted: {
print("RxSwift CombineLatest Finish")
})
.disposed(by: disposeBag)
aSubject.onNext(1)
aSubject.onNext(2)
bSubject.onNext(3)
bSubject.onNext(4)
// RxSwift CombineLatest : (2, 3)
// RxSwift CombineLatest : (2, 4)
ReactiveSwift
combineLatest
์คํผ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์๋ค.
let aProperty = MutableProperty<Int>(0)
let bProperty = MutableProperty<Int>(0)
aProperty.signal
.combineLatest(with: bProperty.signal)
.observe { event in
switch event {
case let .value(value):
print("ReactiveSwift CombineLatest : \(value)")
case .failed:
print("ReactiveSwift CombineLatest Error")
case .completed:
print("ReactiveSwift CombineLatest Finish")
default:
break
}
}
aProperty.value = 1
aProperty.value = 2
bProperty.value = 3
bProperty.value = 4
// ReactiveSwift CombineLatest : (2, 3)
// ReactiveSwift CombineLatest : (2, 4)
// ReactiveSwift CombineLatest Finish
์ฐธ๊ณ
Last updated
Was this helpful?