Taehyeon-Kim/SeSAC

[221025] TIL

Taehyeon-Kim opened this issue · 4 comments

Stream

Sequence, Iterator Protocol

Observable

  • 이벤트 전달 객체
  • 게으른 연산

Observer

  • 이벤트 구독 객체

Infinite observable sequences

  • ex. touch, text-field text
  • 언제 끝날지 모르는 이벤트
  • error, completed 발생 x

Finite observable sequences

  • ex. 점진적 다운로드
  • 네트워크 연결 유실, 다운로드 실패, 상태 코드 오류, 디코딩 실패 등으로 Error 발생 가능 -> dispose
  • 다운로드 성공 완료로 Completed 발생 가능 -> dispose

DisposeBag

자자!

  • 기본적으로 ViewController가 deinit 되면, 알아서 disposeBag도 동작한다.
  • 만약 deinit이 정상적으로 안된다면 순환 참조 문제를 신경써봐야 한다.
  • 예외 케이스가 있다면 DisposeBag() 객체를 새롭게 넣어주거나, nil을 할당해주어야 한다.
    • ex. RootView에서 Infinite Sequence가 존재하는 경우

순환 참조 문제 해결

// 기존 해결 방법
signUpButton.rx.tap
    .subscribe { [weak self] _ in
        let alert = UIAlertController(title: "Good", message: nil, preferredStyle: .alert)
        let ok = UIAlertAction(title: "Ok", style: .cancel)
        alert.addAction(ok)
        self?.present(alert, animated: true)
    }
.disposed(by: disposeBag)
// RxSwift 6부터의 해결 방법
signUpButton.rx.tap
    .withUnretained(self)
    .subscribe { vc, _ in
        let alert = UIAlertController(title: "Good", message: nil, preferredStyle: .alert)
        let ok = UIAlertAction(title: "Ok", style: .cancel)
        alert.addAction(ok)
        vc.present(alert, animated: true)
    }
.disposed(by: disposeBag)

Observable의 한계

  • 이미 정해진 값을 방출만 한다.
  • 그 말인 즉슨, 변경이 불가하다!!
  • 아유 불편해

Subject의 등장 배경

  • 나는 값을 방출하고 싶고 동시에 구독도 하고 싶어.
  • Subject(왈) : 그래 내가 해줄게.

Subject

옵저버블, 옵저버의 역할을 모두 하는 녀석

  • Publish Subject
  • Behavior Subject
  • Replay Subject
  • Async Subject