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
- subscribe의 반환 event는
요런 식으로 error가 출력됨
schedule
- Stream의 특정 부분 아래로 분기
- observeOn(ConcurrentDispatchQueueScheduler(qos:)) … 이 코드 아래로는 다 글로벌하게 동작
- observeOn(MainScheduler.instance) … 이 코드 아래부터는 다 main에서 동작 (UI 업데이트 할 때 꼭 써주기)
- Stream 전체를 글로벌로
- subscribeOn(ConcurrentDispatchQueueScheduler(qos:)) … 코드 어디에 넣어도 Stream 전체가 global
외부에 영향 주는 걸 허용하는 부분들
- 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)
Leave a comment