RxKotlin combineLatest

집에 와서 안드로이드 단톡방 쭉쭉 보다가 어떤 분이 질문 올린 글을 봤다.
Rx 공부 해야지 해야지 생각 하다가 안하고 있었는데 마침 문제가 하나 생김 ㅎㅎ

문제는 RxKotlin 을 사용해서 입력창 세가지가 있는데 각각 입력창에서 입력 할 때마다 validation 체크를 하고 다 통과 되면 버튼을 활성화 시키고 싶다.

키워드는 combineLatest 이다. 아래의 TestCode 를 보자.

class CombineLatestTest {
    @Test
    fun test() {
        var isValid = false
        val emailSubject = BehaviorSubject.create<String>()
        val passwordSubject = BehaviorSubject.create<String>()
        val nickNameSubject = BehaviorSubject.create<String>()
        BehaviorSubject.combineLatest<String, String, String, Boolean>(
            emailSubject,
            passwordSubject,
            nickNameSubject,
            Function3<String, String, String, Boolean> { email, password, nickname ->
                return@Function3 email.isNotEmpty() && password.isNotEmpty() && nickname.isNotEmpty()
            }
        ).subscribe { result ->
            isValid = result
             println("활성화 여부 $isValid")
        }

        emailSubject.onNext("이메일 입력")
        assertEquals(isValid, false)

        passwordSubject.onNext("패스워드 입력")
        assertEquals(isValid, false)

        nickNameSubject.onNext("닉네임 입력")
        assertEquals(isValid, true)

        passwordSubject.onNext("")  //패스워드 제거
        assertEquals(isValid, false)

        passwordSubject.onNext("패스워드 입력")  //패스워드 다시 입력
        assertEquals(isValid, true)

    }

}


    결과는 
    활성화 여부 false
    활성화 여부 false
    활성화 여부 true
    활성화 여부 false
    활성화 여부 true


combineLatest 은 파라미터로 ObservableSource 를 받고 마지막에 리턴할 Function 을 받는다.
ObservableSource 갯수 제한은 9개 까지로 확인했다.
테스트 코드라서 isNotEmpty 로 처리 해뒀는데 저기 부분이 isValid 로 변경 되면 되겠다~