์ง๋ ๋ฒ์ ์ ๋ฆฌํ๋ Subject์ ์ฐ๊ณ๋๋ ๋ด์ฉ์ด๋ค.
Subject๋ ์ต์ ๋ฒ๋ธ์ด๋ฉด์ ์ต์ ๋ฒ์ด๋ค.
Relay๋ Subject๊ฐ onCompleted, onError๋ฅผ ๋ฐ์์ํค์ง ์๋๋ค.
์ฆ, ์๋ฌ์ ์๋ฃ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ์ง ์๊ณ , ์ข ๋ฃ๋์ง ์๋ ํน์ํ Subject์ด๋ค.
๊ตฌ๋ ์๊ฐ dispose๋ ๋๊น์ง ๊ณ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ค.
๋ฐ๋ผ์ Relay๋ ์ฃผ๋ก UI ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ค.
Relay์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด์๋ onNext()๊ฐ ์๋ accept ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
Relay๋ RxCocoa์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ผ๋ก import RxCocoa๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
: ๊ตฌ๋ ์ดํ ์๋ก์ด ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ๊ทธ ๊ฐ์ ๊ตฌ๋ ์์๊ฒ ์ ๋ฌ -> ์๋ก์ด ์ด๋ฒคํธ ๋ฐฉ์ถํ ๋
let publishRelay = PublishRelay<String>()
/* accept() ๋ฉ์๋: Relay์ ์๋ก์ด ๊ฐ์ ๋ฐฉ์ถํ๋ ๋ฉ์๋
accept()๋ฅผ ํธ์ถํ๋ฉด Relay ๋ด๋ถ์ ์๋ ๊ตฌ๋
์์๊ฒ ํด๋น ๊ฐ์ด ์ ๋ฌ๋จ.
ํน์ ์ด๋ฒคํธ(๋ฒํผ ํด๋ฆญ, ํ
์คํธ ์
๋ ฅ ๋ฑ)๋ฅผ ํตํด ์ง์ ์๋ก์ด ๊ฐ์ Relay๋ก ์ ๋ฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
*/
publishRelay.accept("Hello") //"Hello"๋ผ๋ ๊ฐ์ PublishRelay๋ก ์ ๋ฌ ํ์ง๋ง ๊ตฌ๋
ํ์ง ์์์ผ๋ฏ๋ก ์ถ๋ ฅx
/* subscribe() ๋ฉ์๋: Observable(๋๋ Relay)๊ฐ ๋ฐฉ์ถํ๋ ๊ฐ์ ๊ตฌ๋
Observable์ด๋ Relay์์ ๋ฐฉ์ถ๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ตฌ๋
ํ ๋ ์ฌ์ฉ
ํน์ Observable(๋๋ Relay)๋ก๋ถํฐ ๋ฐฉ์ถ๋๋ ๊ฐ์ ๋ฐ๊ณ , ๊ทธ์ ๋ฐ๋ผ ๋ฐ์ํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
*/
publishRelay
.subscribe(onNext: { // Relay๊ฐ ๋ฐฉ์ถํ๋ ๊ฐ์ด ๋ค์ด์ค๋ฉด print($0)๋ก ๊ฐ์ ์ถ๋ ฅ
print($0)
})
.disposed(by: disposeBag)
publishRelay.accept("World") //"World"๋ผ๋ ์๋ก์ด ๊ฐ์ด **accept()**๋ก PublishRelay์ ์ ๋ฌ
// ์ถ๋ ฅ
World
: ๊ฐ์ฅ ์ต๊ทผ์ ๊ฐ์ ๊ธฐ์ตํ๊ณ ์๋ค๊ฐ , ๊ตฌ๋ ์ด ์ด๋ฃจ์ด์ง ๋ ๊ฐ์ ์ฆ์ ๋ฐฉ์ถ -> ๋ง์ง๋ง ์ํ๋ฅผ ์ ์งํ๊ณ ์ถ์ ๋
BehaviorSubject์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๊ธฐ๊ฐ์ ๊ฐ์ง๊ณ ์์.
let behaviorRelay = BehaviorRelay(value: 0)
// ์ํ ๋ณ๊ฒฝ์ ๊ตฌ๋
ํ์ฌ ์ฒ๋ฆฌ
behaviorRelay
.subscribe(onNext: {
print("ํ์ฌ ๊ฐ: \($0)")
})
.disposed(by: disposeBag)
// ์ํ ์
๋ฐ์ดํธ
behaviorRelay.accept(behaviorRelay.value + 1)
//์ถ๋ ฅ
ํ์ฌ ๊ฐ: 0
ํ์ฌ ๊ฐ: 1
: ์ด์ ์ ๋ฐฉ์ถ๋ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ์๊ฐ ๊ตฌ๋ ํ ๋ ๋ค์ ๋ฐฉ์ถํด์ฃผ๋ ์ญํ .
์ผ์ ๊ฐ์์ ์ด์ ์ด๋ฒคํธ๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ก์ด ๊ตฌ๋ ์๊ฐ ๊ตฌ๋ ํ ๋, ์ด์ ์ ๋ฐฉ์ถ๋ ์ด๋ฒคํธ๋ฅผ ์ค์ ๋ ๊ฐฏ์๋งํผ ๋ค์ ๋ฐฉ์ถํ๋ค.
let relay = ReplayRelay<Int>.create(bufferSize: 2) // ๋ง์ง๋ง 2๊ฐ์ ์ด๋ฒคํธ๋ง ๊ธฐ์ต
relay.accept(1)
relay.accept(2)
relay.accept(3)
relay.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
// ์ถ๋ ฅ
2
3
ReplayRelay๋ ์ด์ ์ด๋ฒคํธ๋ฅผ ๋ฒํผ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ์ด์๊ฐ ๋ฐ์ํ ์ ์๋ค.
1. ์ ์ ํ ๋ฒํผ ํฌ๊ธฐ ์ค์ ํ๊ธฐ
2. DisposeBag์ ์ฌ์ฉํ ๊ตฌ๋ ํด์ ํ๊ธฐ
3. Instruments ๋๊ตฌ๋ฅผ ์ฌ์ฉํด ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์ธํ๊ธฐ
๐ Reference
https://jazz-the-it.tistory.com/m/73
[ RxSwift ] Subject๋ฅผ ์์๋ณด์ (2) | 2024.10.11 |
---|---|
[ Rxswift ] Observable์ ์์๋ณด์ (3) | 2024.10.04 |