[RxSwift] Subject, .scan, RxCocoa, .bind 개념
iOS/Swift

[RxSwift] Subject, .scan, RxCocoa, .bind 개념

곰튀김 님의 RxSwift 4시간에 끝내기 (종합편) 영상을 보고 작성한 글입니다 ^~^

https://youtu.be/w5Qmie-GbiA

 

정말 생초보,, 아무것도 모르는 입장에서 강의 영상을 보고 의식의 흐름대로 작성한 글이니 비판의 눈으로 글을 읽어 주시면 감사하겠습니다~~ 오류 지적 대환영!

Subject


  • Observable 밖에서 값을 받아 와서 컨트롤할 수 있음
  • 종류 4개(docs 참고)
    • AsyncSubject
    •  
      • Subcribe가 아무리 많이 들어와도 Complete 시점에 가장 마지막 데이터만 모두에게 내려 줌
    • BehaviorSubject
    •  
      • 기본값 하나 가지고 시작, 누군가가 Subscribe하면 기본값을 내려 줌
      • 중간에 새롭게 Subscirbe가 들어오면 기본값으로 가장 최근의 값을 내려 줌
    • PublishSubject
    •  
      • Subscribe가 들어오면 그대로 데이터를 내려 줌
      • 중간에 새롭게 Subscribe가 들어와도 그 중간부터 그대로 내려 줌
    • ReplaySubject
    •  
      • 처음부터 Subscribe하면 PublishSubject와 똑같이 데이터 내려 줌
      • 중간에 Subscribe가 들어오면 그동안의 데이터들을 한번에 Replay하여 내려 줌

Sugar API


.scan

  • 계산된 값을 계속 누적시킴
  • [Scan] — Observable이 배출한 항목에 연속적으로 함수를 적용하고 실행한 후 성공적으로 실행된 함수의 리턴 값을 발행한다
  • 초기값-1번 연산하여 리턴(A), A-2번 연산하여 리턴(B), B-3번 연산하여 리턴(C), C-4번 연산하여 리턴(D) ...
  • 초기값과 연산
    • .scan에 들어올 첫 번째 값은 초기값과 연산됨!
Observable.of(1, 2, 3) // 만약 1, 2, 3이 연속으로 들어온다면
   .scan(0) { (prevValue, newValue) in // 초기값을 0으로!
      return prevValue + newValue
   }
   .subscribe(onNext: { print($0) })
// 결과
1 // (초기값 0 + 1)
3 // (기존값 1 + 2)
6 // (기존값 3 + 3)

RxCocoa


  • Rx를 활용한 UIKit의 Extension 제공
  • Sugar API
    • .bind 순환 참조 없이 사용 가능( .subscribe와 동일)
    • .bind (2:25:25~)
    • UIKit요소.rx.~ 했을 때 나오는 값이 Binder면 바인드를 시킬 수 있음
    • Subscirbe를 하지 않고 bind해서 사용
    • .map { "\($0)" }
      .bind(to: itemCountLabel.rx.text)
      .disposed(by: disposeBag)
    • .subscribe(onNext: [weak self] {
      	self.itemCountLabel.text = $0
      })
      .disposed(by: disposeBag)
    • 위의 두 코드가 같은 동작!
    • 장점: [weak self] 같은 순환 참조 방지를 안 해도 됨
    • 위 코드처럼 UI를 바꾸는 작업을 진행하려면 메인 스케줄러에서 동작시켜야 함!
    • .map { "\($0)" }
      .observeOn(MainScheduler.instance)
      .bind(to: itemCountLabel.rx.text)
      .disposed(by: disposeBag)