1. Subject
- 데이터를 중간에 넣어줄 수도 있고 subscribe를 변경할 수 있는 객체
- 일단 특정 데이터를 위한 통로를 만들어주는 역할을 하고 원하는 시점에 subscribe를 할 수 있도록 지원하는 것이다.
1) BehaviorSubject
- 초기값이 있음
- 중간에 새로 subscribe하면 현재 상태의 데이터를 넘겨줌
- 중간에 오류가 나면 subscribe된 이후에 들어오는 것에도 현재값이 에러이기 때문에 에러를 전달
2) PublishSubject
- 데이터가 발생하면 subscribe된 모든 Stream에 데이터를 전달
- 오류가 발생하면 subscribe된 모든 Stream에 오류를 전달
3) ReplaySubject
- 새로 subscribe가 발생하면 이전에 주어졌던 데이터를 모두 전달하고 시작
4) AsyncSubject
- Subject가 끝나는 타이밍에 subscribe되어 있는 Stream들에 마지막 값을 전달
2. BehaviorSubject
1) 초기화
- 값을 초기화 해준다.
//초기값
let idValid: BehaviorSubject<Bool> = BehaviorSubject(value: false)
let pwValid: BehaviorSubject<Bool> = BehaviorSubject(value: false)
2) Subscribe
- 아래와 같이 Observable에 subscribe를 달고 Subject에 등록한다.
let idInputOb = idField.rx.text.orEmpty.asObservable()
let idValidOb = idInputOb.map(checkEmailValid)
idValidOb.subscribe(onNext: { checkResult in
self.idValid.onNext(checkResult)
})
3) bind
- subject안에서 subject를 등록하는 것을 더 간략화할 수 있다.
- Observable에 바로 Subject를 bind 할 수 있다.
let idInputOb = idField.rx.text.orEmpty.asObservable()
let idValidOb = idInputOb.map(checkEmailValid)
idValidOb.bind(to: idValid).
- 실전에서는 결과를 하나로 묶어서 처리한다.
let idInputOb = idField.rx.text.orEmpty.asObservable()
idInputOb.map(checkEmailValid)
.bind(to: idValid)
.disposed(by: disposeBag)
2. 실전
- 입력과 유효성을 검사하는 입력에 대한 바인딩과 값을 출력하는 부분의 subscribe를 나누어 처리한다.
(텍스트와 유효성을 따로 나누는 것은 텍스트의 데이터를 따로 쓸 수 있기 때문에 나눈 것이다.)
private func bindInput() {
// 아이디입력 바인딩
idField.rx.text.orEmpty
.bind(to: idInputText)
.disposed(by: disposeBag)
// 아이디유효성 검사 바인딩
idInputText.map(checkEmailValid)
.bind(to: idValid)
.disposed(by: disposeBag)
// 비밀번호입력 바인딩
pwField.rx.text.orEmpty
.bind(to: pwInputText)
.disposed(by: disposeBag)
// 비밀번호유효성 검사 바인딩
pwInputText.map(checkPasswordValid)
.bind(to: pwValid)
.disposed(by: disposeBag)
}
private func bindOutput()
{
// 구독
idValid.subscribe(onNext: { checkResult in
self.idValidView.isHidden = checkResult
}).disposed(by: disposeBag)
pwValid.subscribe(onNext: { checkResult in
self.pwValidView.isHidden = checkResult
}).disposed(by: disposeBag)
Observable.combineLatest(idValid, pwValid, resultSelector: { $0 && $1})
.subscribe(onNext: { resultCheck in self.loginButton.isEnabled = resultCheck })
.disposed(by: disposeBag)
}
'앱 개발자 역량 > IOS' 카테고리의 다른 글
Swift ] Webview에서 사진, 카메라 사용하기 (0) | 2019.07.29 |
---|---|
RxSwift ] 8. Driver, Unfinished Observable (0) | 2019.07.22 |
RxSwift ] 6. UI에 적용하기 (0) | 2019.07.22 |
RxSwift ] 5. Scheduler, Side Effect (0) | 2019.07.19 |
RxSwift ] 4. 다양한 operator 확인 방법 (0) | 2019.07.16 |