SWIFT/RxSwift

RxSwift 기본정리3(Subjects)

KataRN 2022. 12. 12. 01:05
반응형

안녕하세요. 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