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)
    }

+ Recent posts