RxSwift 登录模块Service以及ViewController(直接拿走不谢)

739 阅读1分钟

##使用RxSwift可以很好的处理登录的一些逻辑处理,下面的代码不仅是自己以后可能会复用的也是加深记忆的过程。

登录模块的一些Service

import Foundation

class InputValidator {
    
    //验证是否是合法邮箱地址
    class func isValidEmail(email:String) -> Bool {
        let regex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
        let predicate = NSPredicate(format: "SELF MATCHES %@", regex)
        let isValid = predicate.evaluate(with: email)
        return isValid
    }
    
    //验证密码长度
    
    class func isValidPassword(password:String) -> Bool {
        
        return password.count >= 8
    }
    
    //验证UIDatePicker输入的日期是否小于当天
    class func isValidDate(date:Date) -> Bool {
        let  calender = NSCalendar.current
        let compare = calender.compare(date,
                                       to: Date(),
                                       toGranularity: .day)
        return compare == .orderedAscending
    }
    
}

##在ViewController中的处理。直接上代码

class SignUpViewController: UIViewController {

    @IBOutlet weak var userNameInput: UITextField!
    @IBOutlet weak var passwordInput: UITextField!
    @IBOutlet weak var signBtn: UIButton!
    
    var bag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.userNameInput.layer.borderWidth = 1
        self.passwordInput.layer.borderWidth = 1
        
        let emailObservable = self.userNameInput.rx.text.orEmpty
                              .map{ (input:String) -> Bool in
                              return InputValidator.isValidEmail(email: input)
        }
        
        _ = emailObservable.map{ (isValid:Bool) -> CGColor in
            return isValid ? UIColor.green.cgColor : UIColor.clear.cgColor
            }.subscribe(onNext: { (color) in
                self.userNameInput.layer.borderColor = color
            })
        
        
        let passwordObservable = self.passwordInput.rx.text.orEmpty
            .map{ (password:String) -> Bool in
              return   InputValidator.isValidPassword(password: password)
        }
        _ = passwordObservable.map{ (isValid:Bool) -> CGColor in
            return isValid ? UIColor.green.cgColor : UIColor.clear.cgColor
            }.subscribe(onNext: { (color) in
                self.passwordInput.layer.borderColor = color
            })
        
        Observable.combineLatest(emailObservable,passwordObservable) {
            (validEmail:Bool,validPassword:Bool) -> [Bool] in
             return [validEmail,validPassword]
            }.map{ (input:[Bool]) -> Bool in
                return input.reduce(true,{ (x,y) -> Bool in
                 x && y
              })
            }.subscribe(onNext:{(isValid) in
                self.signBtn.isEnabled = isValid ? true : false
            })
    }
}