[RxSwift] Subjects - 2

잡담

오우.. 오늘 정말 날이 춥네요.. 밖에 나갔다왔는데, 진짜 춥더라구요 ㅎㅎ 오늘은 사실 제가 일주일 중에 딱 하루 쉬는 날인데, RxSwift 공부를 할까말까하다가 해봅니다 ㅎㅎ

제가 막 공부를 재밌어하는 편은 아닌데, 아 뭔가 RxSwift는 재밌네요..? 음.. 이상한 사람처럼 보일까요?? ㅋㅋㅋㅋㅋ

아! 아직 실전 적용을 안하고 배우는 단계라 그런가봐요 ㅋㅋㅋ

학습한 내용

01. ReplaySubject

버퍼가 있는 Subject라고 생각하면 될 것 같아요!

예를 들어 버퍼 사이즈가 2라고 치면, 나중에 subject를 구독하더라도 이전의 이벤트를 버퍼 사이즈(2)만큼 받을 수 있다고 하네요.

그래서 사용 시, 주의 사항이 있는데 이 버퍼라는게 메모리에서 가지고 있는거라고 하네요. 그래서 만약에 메모리를 크게 차지하는 값들을 버퍼로 가지고 있는 것은 메모리가 엄청난 부하를 준다고 합니다.

 let subject = ReplaySubject<String>.create(bufferSize: 2)

이런 식으로 생성할 때, 버퍼 사이즈를 설정해주네요.

용도는 최근 값 이외에 더 많은 값을 보여주고 싶을 때, 쓴다고 하네요! 예를 들어 검색창같이, 최근 5개의 검색어를 보여주고 싶을 때??

02. Variable

음.. 이건 차이점이 너무 중요해서 학습 링크에 있는 부분들을 그대로 인용해야 겠네요!

  • 앞서 얘기한 것처럼 Variable은 BehaviorSubject를 래핑하고, 이들의 현재값을 상태State 로 보유한다. 따라서 현재값은 value 프로퍼티를 통해서 알 수 있다.
  • value 프로퍼티를 Variable의 새로운 요소로 가지기 위해선 일반적인 subject나 observable과는 다른 방법으로 추가해야한다. 즉 onNext(_:)를 쓸 수 없다.
  • 다른 Subject와 대조되는 Variable의 또 다른 특성은, 에러가 발생하지 않을 것임을 보증한다는 것이다. 따라서 .error 이벤트를 variable에 추가할 수 없다.
  • 또한, variable은 할당 해재되었을 때 자동적으로 완료되기 때문에 수동적으로 .completed를 할 필요도/할 수도 없다.

확실히 차이가 보이네요.. 이벤트를 추가하는 방식도 많이 다른 것 같아요 코드로 보시죠!

 example(of: "Variable") {

     // 1
     let variable = Variable("Initial value")
     let disposeBag = DisposeBag()

     // 2
     variable.value = "New initial value"

     // 3
     variable.asObservable()
         .subscribe {
             print(label: "1)", event: $0)
         }
         .disposed(by: disposeBag)

     /* Prints:
      1) New initial value
     */  
 }

next를 못쓰는 대신 value로 새로운 값을 넣어줄 수 있습니다. 또한, 구독을 할려면 asObservable() 을 호출해줘야 구독할 수 있다고 하네요!

asObservable은 variable이 subject처럼 읽힐 수 있도록 한다고 합니다.

이 부분에서 궁금한 점은 초기값을 설정해주는데, 초기값은 출력이 안되네요?? 음.. 뭘까요..? 초기값은 무엇을 위한 것인지 잘 모르겠습니다.

-> 아마도 초기 값은 생각을 못해준 것 같네요! 검색을 해보니까 초기값도 출력을 해줘야 맞는거네요.

참고 블로그

용도는 유저의 세션 상태를 관찰할 때 적합하다고 하네요!

소감

오늘은 쉬는 날이었지만, 공부를 하게 되었는데요 ㅋㅋㅋ 확실히 유튜브를 보면서 시간을 보내기보단 유익한 시간이었던 것 같네요!

오늘 공부하면서 느낀 점은 학습하는 링크도 무작정 믿으면 안되겠네요.. 최대한 이상하다고 생각되는 점은 검색해서 찾아보려고 합니다.

그래도 최대한 RxSwift는 이렇게 순차적으로 배울 수 있다는 점에 감사하고 있습니다.