subject는 데이터가 발생하면 나중에 외부에서 넣어줄 수 있다.
서브젝트는 데이터를 넣어질 수 있고 구독 당할 수 도 있다.
//
// ViewController.swift
// RxSwiftIn4Hours
//
// Created by iamchiwon on 21/12/2018.
// Copyright © 2018 n.code. All rights reserved.
//
import RxCocoa
import RxSwift
import UIKit
class ViewController: UIViewController {
var disposeBag = DisposeBag()
let idInputText: BehaviorSubject<String> = BehaviorSubject(value: "")
let idValid: BehaviorSubject<Bool> = BehaviorSubject(value: false)
let pwInputText: BehaviorSubject<String> = BehaviorSubject(value: "")
let pwValid: BehaviorSubject<Bool> = BehaviorSubject(value: false)
override func viewDidLoad() {
super.viewDidLoad()
bindInput()
bindOutput()
}
// MARK: - IBOutler
@IBOutlet var idField: UITextField!
@IBOutlet var pwField: UITextField!
@IBOutlet var loginButton: UIButton!
@IBOutlet var idValidView: UIView!
@IBOutlet var pwValidView: UIView!
// MARK: - Bind UI
private func bindInput() {
// id input +--> check valid --> bullet
// |
// +--> button enable
// |
// pw input +--> check valid --> bullet
// input : 아이디 입력, 비번 입력
idField.rx.text.orEmpty
.bind(to: idInputText)
.disposed(by: disposeBag)
pwField.rx.text.orEmpty
.bind(to: pwInputText)
.disposed(by: disposeBag)
idInputText.map(checkEmailValid)
.bind(to: idValid)
.diposed(by:disposeBag) // 바로 위 코드와 같은 기능
pwInputText.map(checkPasswordValid)
.bind(to: pwValid)
.diposed(by:disposeBag)
}
private func bindOutput() {
// output : 불릿,로그인 버튼 인에이블
idValid.subscibe(onNext: { b in
self.idValidView.isHidden = b
})
.diposed(by : disposeBag)
pwValid.subscibe(onNext: { b in
self.pwValidView.isHidden = b
})
.diposed(by : disposeBag)
Observable.combineLatest(source1: idValidOb
, source2: pwValidOb ,
resultSelector: { $0 && $1})
.subscirbe(onNext: { b in
self.loginButton.isEnabled = b
})
.diposed(by : disposeBag)
}
// MARK: - Logic
private func checkEmailValid(_ email: String) -> Bool {
return email.contains("@") && email.contains(".")
}
private func checkPasswordValid(_ password: String) -> Bool {
return password.count > 5
}
}