์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[ RxSwift ] Relay๋ฅผ ์•Œ์•„๋ณด์ž

๐ŸŽ iOS/RxSwift

by AHN.Jihyeon 2024. 10. 15. 02:49

๋ณธ๋ฌธ



 

๐Ÿ”Ž  1 . Relay


์ง€๋‚œ ๋ฒˆ์— ์ •๋ฆฌํ–ˆ๋˜ Subject์™€ ์—ฐ๊ณ„๋˜๋Š” ๋‚ด์šฉ์ด๋‹ค.

 

Subject๋Š” ์˜ต์ €๋ฒ„๋ธ”์ด๋ฉด์„œ ์˜ต์ €๋ฒ„์ด๋‹ค. 

 

Relay๋Š” Subject๊ฐ€ onCompleted, onError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

์ฆ‰, ์—๋Ÿฌ์™€ ์™„๋ฃŒ ์ด๋ฒคํŠธ๋ฅผ ๋ฐฉ์ถœํ•˜์ง€ ์•Š๊ณ , ์ข…๋ฃŒ๋˜์ง€ ์•Š๋Š” ํŠน์ˆ˜ํ•œ Subject์ด๋‹ค.

๊ตฌ๋…์ž๊ฐ€ dispose๋  ๋•Œ๊นŒ์ง€ ๊ณ„์† ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ Relay๋Š” ์ฃผ๋กœ UI ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. 

 

Relay์— ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” onNext()๊ฐ€ ์•„๋‹Œ accept ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

 

Relay๋Š” RxCocoa์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ import RxCocoa๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

 

 

 

๐Ÿ”Ž  2. Relay์˜ ์ข…๋ฅ˜


1) PublishRelay

: ๊ตฌ๋… ์ดํ›„ ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ๊ทธ ๊ฐ’์„ ๊ตฌ๋…์ž์—๊ฒŒ ์ „๋‹ฌ -> ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ ๋ฐฉ์ถœํ•  ๋•Œ

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

 

 

2) BehaviorRelay

:  ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ๊ฐ’์„ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ , ๊ตฌ๋…์ด ์ด๋ฃจ์–ด์งˆ ๋•Œ ๊ฐ’์„ ์ฆ‰์‹œ ๋ฐฉ์ถœ -> ๋งˆ์ง€๋ง‰ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

BehaviorSubject์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ดˆ๊ธฐ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.

let behaviorRelay = BehaviorRelay(value: 0)

// ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ตฌ๋…ํ•˜์—ฌ ์ฒ˜๋ฆฌ
behaviorRelay
    .subscribe(onNext: { 
        print("ํ˜„์žฌ ๊ฐ’: \($0)")
    })
    .disposed(by: disposeBag)

// ์ƒํƒœ ์—…๋ฐ์ดํŠธ
behaviorRelay.accept(behaviorRelay.value + 1)



//์ถœ๋ ฅ
ํ˜„์žฌ ๊ฐ’: 0
ํ˜„์žฌ ๊ฐ’: 1

 

 

 

3) ReplayRelay

: ์ด์ „์— ๋ฐฉ์ถœ๋œ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…์ž๊ฐ€ ๊ตฌ๋…ํ•  ๋•Œ ๋‹ค์‹œ ๋ฐฉ์ถœํ•ด์ฃผ๋Š” ์—ญํ• . 

์ผ์ • ๊ฐœ์ˆ˜์˜ ์ด์ „ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ตฌ๋…์ž๊ฐ€ ๊ตฌ๋…ํ•  ๋•Œ, ์ด์ „์— ๋ฐฉ์ถœ๋œ ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •๋œ ๊ฐฏ์ˆ˜๋งŒํผ ๋‹ค์‹œ ๋ฐฉ์ถœํ•œ๋‹ค. 

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

 

'๐ŸŽ iOS > RxSwift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[ RxSwift ] Subject๋ฅผ ์•Œ์•„๋ณด์ž  (2) 2024.10.11
[ Rxswift ] Observable์„ ์•Œ์•„๋ณด์ž  (3) 2024.10.04

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ