RxSwift 사용 설명서(작성중)

참고 자료

docs 중 rxswift 관련된 설명이 없을 땐 rxjava 1.x 에 있는 설명을 참고

Observable, Operators, Scheduler

disposed와 disposeBag

  • subscribe의 반환형이 dispose
  • disposeBag은 disposed된 것들을 담는 공간.

just, from

  • Obsevable Stream 생성.
    • just는 단일 항목, from은 여러 항목

subscribe

  • 나 이제 이거 결과 갖다 쓸거야! (subscribe(on:))
    • subscribe의 반환 event는
      • .next(let str) : from으로 여러 항목을 받아 처리하는 경우 next로 들어오게 됨
      • .error(let err) : error인 경우 stream 종료
      • .completed : completed인 경우도 stream 종료 (모든 처리가 끝나고 나옴)
    • onNext, onError, onCompleted, onDisposed(stream이 소멸하기 전에 여기를 들어옴): 필요한 처리만 하고 싶을 때, onNext를 제외하고는 다 optional

image 요런 식으로 error가 출력됨

schedule

  • Stream의 특정 부분 아래로 분기
    • observeOn(ConcurrentDispatchQueueScheduler(qos:)) … 이 코드 아래로는 다 글로벌하게 동작
    • observeOn(MainScheduler.instance) … 이 코드 아래부터는 다 main에서 동작 (UI 업데이트 할 때 꼭 써주기)
  • Stream 전체를 글로벌로
    • subscribeOn(ConcurrentDispatchQueueScheduler(qos:)) … 코드 어디에 넣어도 Stream 전체가 global

외부에 영향 주는 걸 허용하는 부분들

image

  • subscribe
  • do

Subject

  • AsyncSubject
  • BehaviorSubject
  • PublishSubject
  • ReplaySubject

RxCocoa

idField.rx.text.orEmpty         // idField의 text를 비동기로 입력할 때마다 계속 체크. orEmpty로 빈 값인지 확인
   .map(checkEmailValid)
   .subscribe(onNext: { boolean in
      self.idValidView.isHidden = boolean       // valid가 충족 되면 빨간 점 제거
   })
   .dispose(by: disposeBag)
// 두가지의 Observable을 결합해서 새로운 결과를 낸다.
// resultSselector에서 처음 두 개의 인자 결과값(Stream 두개)을 가지고 원하는 값을 도출해낸다.
// 도출한 값을 button에 적용한다.
// combineLatest는 두 개의 stream 중 하나라도 값이 바뀌면 바로 호출된다.
Observable.combineLatest(
   idField.rx.text.orEmpty.map(checkEmailValid),
   pwField.rx.text.orEmpty.map(checkPasswordValid),
   resultSelector: {s1, s2 in s1 && s2}
   )
   .subscribe(onNext: {boolean in
      self.loginButton.isEnabled = boolean
   })
   .disposed(by: disposeBag)

refactoring

// property들이 다 자동으로 값이 바뀐다

// input
let idInputOb: Observable<String> = idField.rx.text.orEmpty.asObservable()
let emailValid = idInputOb.map(checkEmailValid)

let pwInputOb: Observable<String> = pwField.rx.text.orEmpty.asObservable()
let pwValid = pwInputOb.map(checkPasswordValid)

// output
idvalidOb.subscribe(onNext: {b in self.idValidView.isHidden = b})
   .disposed(by: disposeBag)

pwvalidOb.subscribe(onNext: {b in self.pwValidView.isHidden = b})
   .disposed(by: disposeBag)
   
Observable.combineLatest(idValidOb, pwValidOb, resultSelector: {$0 && $1})
   .subscribe(onNext: {b in self.loginButton.isEnabled = boolean })
   .disposed(by: disposeBag)

Categories:

Updated:

Leave a comment