[RxSwift][TIL] BehaviorSubject

Uno·2022년 1월 22일
0

RxSwift

목록 보기
5/9

BehaviorSubject

  • 결론

기본 값(최초 next이벤트)이 있음 + 구독 시, 가장 마지막 이벤트를 전달함 의 기능을 가진 publishSubject

https://reactivex.io/documentation/ko/subject.html 공식문서에 있는 그림입니다.

맨 위에 박스쳐진 선이 subject이고 아래 두 선이 옵저버 입니다.

보면은 핑크색 공을 처음에 서브젝트가 가지고 있습니다. 두 번째 선은 subscribe가 화살표가 서브젝트를 향하자마자 바로 핑크색을 받습니다.이것이 최초 기본값을 준 넥스트이벤트를 전달받은 겁니다. 이후에 빨간공을 받으면 빨강공 이벤트를 받습니다. 세번 째줄이 subscrib하게되면 녹색공을 받죠. 이것은 두 번째 옵저버가 받은 핑크가 아닌 next이벤트 중 가장 최신 값을 받는 그림입니다. 여기까직 BehaviorSubject의 개념설명입니다.

상황을 가정해서 코드를 작성해보겠습니다.

만약에 사용자가 앱에 가입했는데, 자기소개를 입력하지 않았으면 기본 자기소개 내용을 UI로 전달하고 만약에 수정했을 경우, 가장 마지막에 있던 값(마지막에 수정했던 값이죠.)을 UI로 보여주고싶습니다.

let userDescription = BehaviorSubject<String>(value: "처음뵙겠습니다. 잘부탁해요^^")

그리고 바로 옵저버를 추가하겠습니다.

let descriptionLabel 
= userDescription
	.subscribe { self.label.text = $0 }
	.disposed(by: bag)

(UI를 처리하므로 main스레드에서 처리되도록 처리해주어야하지만, 해당 부분은 다른 글에서 설명하고 일단 데이터 흐름을 위해 작성한 코드이니 감안하고 읽어주세요.)

이렇게 되면, userDescription 데이터가 최초 이벤트로 "처음뵙겠습니다. 잘부탁해요^^" 이벤트를 전달할 것이고, 추가로 변경이 있게되면 변경될 것입니다.

그러면 이벤트를 다른 것을 하나더 추가한 이후에 다른 옵저버를 추가하면 어떻게 될까요?

userDescription.onNext("저는 Rx와 사랑에 빠졌습니다.")

let editDescriptionLabel
= userDescription
	.subscribe { self.otherlabel.text = $0 }
	.disposed(by: bag)

이렇게 되면 editDescriptionLabel에 기본값으로 "저는 Rx와 사랑에 빠졌습니다." 가 이벤트로 전달됩니다. 즉, 제일 마지막에 받은 이벤트가 기본 이벤트로 변경되면서 처음 구독했던 것처럼 동작하게됩니다.

profile
iOS & Flutter

0개의 댓글