🔎 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 |