美文网首页
RXSwift使用---登陆示例

RXSwift使用---登陆示例

作者: StoneWing | 来源:发表于2017-06-08 18:02 被阅读115次

    最近在重写的项目中使用了RXSwift,下面使用一个登陆的界面来说明一下RXSwift的使用过程

    • 创建如下一个界面

    <img src="https://img.haomeiwen.com/i970635/6144abf1a740b1a3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width = "300" height = "200" alt="登陆界面" align=center />

    • 创建viewmodel类,初始化方法

          init(phoneNum: Observable<String>,
             pwdNum: Observable<String>,
             loginTap: Observable<Void>) {
            
          //判断手机号码框输入是否正确
              phoneEnable = phoneNum.map({ (phone) in
                
                return phone.length == 11
            }).shareReplay(1)
            //判断 密码框输入是否合法
               pwdEnable = pwdNum.map({ (pwd) in
                
                return pwd.length >= 6
            }).shareReplay(1)
            //登陆按钮是否可以点击
            loginEnable = Observable.combineLatest(phoneEnable, pwdEnable) {($0,$1)}.map({ (x,y)  in
                return x && y
            }).shareReplay(1)
            
            let phoneAndPwd = Observable.combineLatest(phoneNum, pwdNum) {($0,$1)}.shareReplay(1)
            //登陆的结果
            loginResult = loginTap.withLatestFrom(phoneAndPwd).flatMap({ (phone, pwd) in
                //ALTools自己封装的一个Alamofire支持rx的方法
                return ALTools().rx_RequestXML(loginApi.login(phone: phone, pwd: pwd)).map({ (data) in
                    
                   let json = JSON(data: data)
                    .......
                  //正确解析后
                  return true
                    
                }).catchErrorJustReturn(false)
            })
            
          }
    
    
    • 返回登陆的controller,进行绑定

          let viewModel = LoginViewModel(phoneNum: self.phoneField.rx.text.orEmpty.asObservable(), pwdNum: self.pwdField.rx.text.orEmpty.asObservable(), loginTap: self.loginBT.rx.tap.asObservable())
          viewModel. phoneEnable.subscrib(onNext: { (result) in
                //手机号码是否合法的一些操作
                ...
          }).addDisposableTo(disposeBag)
          viewModel. pwdEnable(onNext: { (result) in
                //密码是否合法的一些操作
                ...
          }).addDisposableTo(disposeBag)
          viewModel.loginEnable.subscribe(onNext: { (result) in
          //登陆按钮是否可以点击的一些操作
                loginBT.backgroundColor = result ? NavbarColor:UIColor.lightGray
                self.loginBT.isEnabled = result
                
            }).addDisposableTo(disposeBag)
            
          viewModel.loginResult.subscribe(onNext: { (result) in
                //登陆是否成功
                if result {
                    let user: User! = User.info
                    SLLog(message: "学校:\(user.schID!),用户:\(user.userName!)")
                    
                    let controller = HomeViewController()
                    self.navigationController?.pushViewController(controller, animated: true)
                }
            }).addDisposableTo(disposeBag)
    

    下一节:RxSwift+MJRefresh+Realm实现tableView的刷新(分页)

    相关文章

      网友评论

          本文标题:RXSwift使用---登陆示例

          本文链接:https://www.haomeiwen.com/subject/fsytqxtx.html