RXSwift使用---登陆示例

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

  • 创建如下一个界面

登陆界面
  • 创建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的刷新(分页)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • //PublishSubject -> 会发送订阅者从订阅之后的事件序列 PublishSubjectlet se...
    andrewJN阅读 1,716评论 0 3
  • 首先,何为RxSwift? RxSwift是ReactiveX的Swift版本,一个响应式变成框架。传送门 开始之...
    cocoawork丶阅读 589评论 0 3
  • 前言 在之前用Objective-C语言做项目的时候,我习惯性的会利用MVVM模式去架构项目,在框架Reactiv...
    Tangentw阅读 21,473评论 32 124
  • 最近在学习RxSwift相关的内容,在这里记录一些基本的知识点,以便今后查阅。 Observable 在RxSwi...
    L_Zephyr阅读 1,949评论 1 4
  • 你有没有暗恋过一个人?我不信你没有过,幼儿园的小朋友都有可能喜欢上一个人,何况是我们这些奔二奔三甚至是奔四奔五的老...
    二姑娘儿阅读 740评论 10 12

友情链接更多精彩内容