앱 개발자 역량/IOS

RxSwift ] 6. UI에 적용하기

it_블로거 2019. 7. 22. 14:03

1. UI 비동기 처리

- UI가 값의 변화에 따라 변하는 경우 이를 비동기로 처리하기 위해 사용할 수 있다.

 

1) EditField

- UI 컨트롤에 rx를 달아서 값의 변화를 Observable하게 지켜볼 수 있다.

- filter와 map을 통해 데이터를 String?에서 String 으로 변화하고 checkEmailValid 함수로 확인한다.

- 이 값이 true인지 false인지 값이 변할 때마다 확인할 수 있다.

        idField.rx.text
            .filter { $0 != nil }
            .map { $0! }
            .map(checkEmailValid)
            .subscribe(onNext: { s in
            print(s)
        })
        .disposed(by: disposeBag)

 

2) Optional 확인하기

- filter와 map을 통해 optional을 확인해도 되지만 스트림에서 orEmpty을 제공한다.

idField.rx.text.orEmpty
            .map(checkEmailValid)
            .subscribe(onNext: { s in
            print(s)
        })
        .disposed(by: disposeBag)

 

3) 결과를 통해 UI에 반영하기

        idField.rx.text.orEmpty
            .map(checkEmailValid)
            .subscribe(onNext: { checkResult in
                self.idValidView.isHidden = checkResult
        })
        .disposed(by: disposeBag)

 

2. combineLatest

- 여러가지 Observable의 결과를 조합해야하는 경우 ( => 아이디 비밀번호 유효성 검사 후 버튼 Enable )

- combineLastest를 사용하면 A의 결과와 B의 결과를 통해 resultSelector의 결과를 만들과 결과를 반환한다.

- 해당 결과를 subscribe에서 받아서 처리하면 두개를 바인딩하는 결과를 얻을 수 있다.

        Observable.combineLatest(idField.rx.text.orEmpty.map(checkEmailValid),
                                 pwField.rx.text.orEmpty.map(checkPasswordValid),
                                 resultSelector: {s1, s2 in s1 && s2})
            .subscribe(onNext: { checkResult in
                self.loginButton.isEnabled = checkResult
            })
        .disposed(by: disposeBag)

 

2. 기능별 분리하기

- rx에서 Observable을 얻어내고 Observable에서 입력값이 변하게 되면 각 단계별로 처리

- 입력, 결과, 처리(구독) 부분을 각각 나누어 처리할 수 있다

 

        // 입출력
        let idInputOb = idField.rx.text.orEmpty.asObservable()
        let idValidOb = idInputOb.map(checkEmailValid)
        
        let pwInputOb = pwField.rx.text.orEmpty.asObservable()
        let pwValidOb = pwInputOb.map(checkPasswordValid)
        
        // 구독
        idValidOb.subscribe(onNext: { checkResult in
            self.idValidView.isHidden = checkResult
        })
        .disposed(by: disposeBag)
        pwValidOb.subscribe(onNext: { checkResult in
            self.pwValidView.isHidden = checkResult
        })
        .disposed(by: disposeBag)
        
        Observable.combineLatest(idValidOb, pwValidOb, resultSelector: { $0 && $1})
            .subscribe(onNext: { resultCheck in self.loginButton.isEnabled = resultCheck })
            .disposed(by: disposeBag)