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