[RxSwift] Subjects - 1

잡담

안녕하세요! 매일매일 RxSwift를 1시간씩 공부하려고 했습니다만 ㅎㅎ 쉽지않네요.. 일정이 있어서 어제는 공부를 못했습니다.

저 스스로의 약속이지만, 딱히 일정이 없는 날에는 꼭 1시간씩 공부하고 블로그에 올려볼려고 합니다. 중간에 포기하지 않고! 모든 챕터를 공부하고! 실전 프로젝트에 RxSwift를 적용하는 그 날까지!!!

RxSwift를 다 공부하면, 프로젝트에 연습하면서 ReactorKit에 대해 공부해볼 계획입니다.

학습한 내용

01. Subject의 정의??

 실시간으로 Observable에 새로운 값을 수동으로 추가하고 subscriber에게 방출하는 것
 Observable이자 Observer인 녀석

PublishSubject는 현재(current)의 subscriber에만 이벤트를 방출한다. 따라서 어떤 정보가 추가되었을 때 구독하지 않았다면 그 값을 얻을 수 없다.

subscribe 이전에 onNext로 추가된 이벤트는 그 값을 얻을 수 없다고 하네요! 자세한 예시는 링크로!

02. Subject의 종류

  • PublishSubject: 빈 상태로 시작하여 새로운 값만을 subscriber에 방출한다.
  • BehaviorSubject: 하나의 초기값을 가진 상태로 시작하여, 새로운 subscriber에게 초기값 또는 최신값을 방출한다.
  • ReplaySubject: 버퍼를 두고 초기화하며, 버퍼 사이즈 만큼의 값들을 유지하면서 새로운 subscriber에게 방출한다.
  • Variable: BehaviorSubject를 래핑하고, 현재의 값을 상태로 보존한다. 가장 최신/초기 값만을 새로운 subscriber에게 방출한다.

03. PublishSubject

~ 7): subject 자체가 .completed 또는 .error 이벤트 같은 완전종료 이벤트들을 받으면, 새로운 subscriber에게 더이상 .next이벤트를 방출하지 않을 것으로 예상할 수 있다. 하지만 subject는 이러한 종료 이벤트들을 이후 새subscriber들에게 재방출한다.

이 부분이 제일 궁금했던 점이었습니다. Observable의 경우, .completed나 .error를 밷으면 끝나는데, 이것도인가? 라는 생각을 했었는데, 새로운 subscriber들에게 재방출한다고 하네요! disposed된 이후에는 동작하지 않는다고 합니다.

04. BehaviorSubject

첫 번째 이벤트가 발생한 후 첫 번째 구독자가 구독을 시작했지만 PublishSubject와는 다르게 직전의 값1을 받는다. 구독을 한 시점에서 이전 이벤트의 값을 가져오냐의 차이인 것 같습니다.

      // 6
     subject.onNext("X")

     // 5
     subject
         .subscribe{
             print(label: "1)", event: $0)
         }
         .disposed(by: disposeBag)

     // 7
     subject.onError(MyError.anError)

     // 8
     subject
         .subscribe {
             print(label: "2)", event: $0)
         }
         .disposed(by: disposeBag)
 }

구독하면 어떻게 나올까? error 이벤트가 한번 찍힐까 두번 찍힐까? 두 개의 구독자에 대해 두번찍히게 된다.

코드를 보시면 마지막에 error 이벤트를 추가 해놓고 구독을 했는데, 왜 두 번 찍히는지 잘 모르겠습니다.. 이전에 구독해준건 disposed되는거 아닌가요??

disposed되면 더이상 작동하지 않는 거 아니였나요?? 음.. 위에서의 완전종료라는 말 뜻이 뭔지 모르겠네요..

-> 이 부분에 대해 명확히 하기 위해 DisposeBag에 대해 검색해봤는데요!

DisposeBag에 담긴 Disposable들은 DisposeBag이 dealloc될 때, 같이 dealloc된다.

출처: https://rhammer.tistory.com/286 [고무망치의 Dev N Life]

라고 합니다. 메모리릭을 예방하기위해 dispose 해줘야한다는 건 알겠는데, 저는 처음에 DisposeBag에 담기만하면 즉시 disposed되는 줄 알았어요..

하지만 그게 아니라 DisposeBag이 메모리에서 해제될 때, 넣어준 것들이 한 번에 해제되는 거였네요!

소감

하루에 한 챕터 씩 무조건 공부하는 것도 좋지만, 너무 분량에 신경쓰기보단 적은 양을 공부하더라도 꾸준하고, 확실하게 공부해보려고 합니다 ㅎㅎ

처음엔 저도 챕터 1을 보고 한 챕터씩 공부해보려고 했는데, 내용이 어려워지고 챕터 당 분량도 많아지다보니 한 시간에 한 챕터를 다 공부하는 건 힘드네요 😥

그래서 단순하게 학습만 하기 보단 완벽하게 이해하지 못한 부분은 구글링도 하면서 확실하게 하고 넘어가야겠다고 다짐했습니다.

모든 챕터를 다 학습하고 실전에 적용해보는 그 날까지 화이팅!!