안녕하세요. KataRN입니다.
오늘은 Subjects에 대해 정리해보겠습니다.
참고 블로그 - https://ios-development.tistory.com/98
1. Subjects란?
(실제 앱 구동시) run time시에 Observable에 값을 추가하여 emit이 발생하게끔 해주는 대리인
Observable에 값을 추가하는 대상은 Observer라 부르며(추상적인 개념),
Observable과 Observer 기능을 둘 다 하는 것이 바로 Subjects.( subscriber가 아님을 주의 이게 굉장히 헷갈림. 저는 이게 정리하기로 결심한 이유중 하나입니다...)
- bind를 통해 미리 subscribe를 해놓고 Observable에 값을 추가하면 view는 추가된 값을 전달받고 업데이트하는 방식?
- subject에서 .value()로 값을 뽑아쓸때 try(do-catch)구문을 사용해야한다.
2. Subject의 종류
1) PublishSubject : empty상태로 시작, 새로운 이벤트만 subscriber에게 emit
- 구독된 순간 새로운 이벤트 수신을 알리고 싶을때 사용
protocol 선수 {
var 점수: BehaviorSubject<Int> { get }
}
struct 양궁선수: 선수 {
var 점수: BehaviorSubject<Int>
}
let 🇰🇷국가대표 = 양궁선수(점수: BehaviorSubject(value: 10))
let 🇺🇸국가대표 = 양궁선수(점수: BehaviorSubject(value: 8))
let 올림픽경기 = PublishSubject<선수>()
올림픽경기
.flatMap {
$0.점수
}
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
//올림픽경기라는 PublishSubject를 구독(subscribe)한다.
//이를 통해 데이터가 들어갈때마다 print(점수)이 작동한다.
올림픽경기.onNext(🇰🇷국가대표)
//올림픽경기에 한국국가대표를 넣는다. -> 구독이 작동한다(🇰🇷국가대표 점수) -> 10점
//이제 올림픽경기에는 한국국가대표의 데이터가 들어가있다.
🇰🇷국가대표.점수.onNext(12)
//🇰🇷국가대표 점수 BehaviorSubject에 12점을 넣는다. -> 올림픽경기의 🇰🇷국가대표 점수가 12점으로 바뀌면서 올림픽경기의 구독이 작동한다.
//-> 12점
올림픽경기.onNext(🇺🇸국가대표)
//올림픽경기에 국가대표를 넣는다. -> 구독이작동한다(🇺🇸국가대표 점수) -> 8점
🇰🇷국가대표.점수.onNext(11)
//-> 11점
🇺🇸국가대표.점수.onNext(9)
//-> 9점
-> 국가대표의 점수를 올리면 올림픽경기의 구독이 발생하는건 왜지...
2) BehaviorSubject : 하나의 초기값으로 시작, 최신 값(.next)만 새로운 subscriber에게 emit
- BehaviorSubject는 초기화 값이 필수이며, 항상 저장되어있는 최신값을 emit
- 다음 구독부터는 직전의 값(최신 데이터)을 갖고 시작한다.
- BehaviorSubject사용 : 뷰를 가장 최신의 데이터로 미리 채우기에 용이(유저 프로필 화면을 BehaviorSubject에 바인딩)
3) ReplaySubject : 버퍼 사이즈를 지정하며, 버퍼 사이즈만큼 새로운 subscriber에게 emit
- ReplaySubject사용 : 최신 데이터 여러 개를 보여주고 싶은 경우 (최근 검색 5개 현황)
- subscribe를 하는 순간만 최신데이터를 버퍼사이즈만큼 가져오고 이후에는 추가될때마다 추가된 값을 가져옴
4) PublishRelay, BehaviorRelay : 오직 .next 이벤트만 emit함 (.completed, .error무시, non-terminating에서 유용하게 사용, realy의 핵심은 절대 끝나지 않음을 보장하는 것)
- PublishRelay : PublishSubject를 단순히 wrap한 것이며 .next만 가능하고 기능 동일
- BehaviorRelay : BehaviorSubject를 단순히 wrap한 것이며 .next만 가능하고 기능 동일(UI용, RxCocoa)
- relay의 추가는 .accept()로 접근
- error, onCompleted() 사용 불가
5) AsyncSubject : 마지막의 이벤트만 subscriber에게 emit (단 .completed이벤트를 받은 경우만)
- .onNext()메소드도 사용 불가, 오직 accept(:_)만 사용가능
오늘도 짧게 정리했습니다.
읽어주셔서 감사합니다.
'SWIFT > RxSwift' 카테고리의 다른 글
Operators 정리 (0) | 2022.12.20 |
---|---|
RxSwift 기본정리2(Traits) (0) | 2022.12.12 |
RxSwift 기본정리(Observable) (0) | 2022.12.12 |