Rxswift入坑系列(2)

  • rx 不建议开始就硬要把基础的啃透了在入手
  • 只需要看的懂做了什么,做完有什么效果可以先入手一些实战了.
  • 模仿官方demo 使用rxcocoa 来构建你的项目.并使用,使用完毕你会有一点懂了.但是越用你会越不懂(这个我写到后面应该会体会更深..毕竟菜鸟级别现在)
  • demo1 中使用
Observable.combineLatest(number1.rx.text.orEmpty, number2.rx.text.orEmpty, number3.rx.text.orEmpty) { textValue1, textValue2, textValue3 -> Int in
                return (Int(textValue1) ?? 0) + (Int(textValue2) ?? 0) + (Int(textValue3) ?? 0)
            }
            .map { $0.description }
            .bind(to: result.rx.text)
            .disposed(by: disposeBag)

完成了一个实用的加法器.非常简洁,rx.text.orEmpty转到定义看四个observerble 的类型,大致可以看到在rx中我们把数据全部当成了observerble类型去处理.从这里我们看出一个思想,Observable内置许多的函数会很方便构建需要的事件流,这个东西表象上就是将数据本身加上一个时间的维度,太抽象了 恶心,时间维度个人理解在程序上就是一个监听者,它会默默的一直(时间)帮你看查一个数据的变化,Observable 将整个变化封装成了一个序列,数据的流,每一次变化,数据会流出来,你在闭包内处理这个流就OK了.

  • demo2

let   phonevalid = txtphone.rx.text.orEmpty.map { $0.characters.count == self.validnumber   }.share(replay: 1)
       
       let   pwdvalid = txtpwd.rx.text.orEmpty.map { $0.characters.count == self.pwdnumber }.share(replay: 1)
       
       let   everthingvalid = Observable.combineLatest(phonevalid, pwdvalid) { $0 && $1 }.share(replay: 1)
       everthingvalid.bind(to: btnlogin.rx.isEnabled).disposed(by: disposeBag)
       
       everthingvalid.subscribe(onNext: { (ok) in
           print(ok)
           ok ? self.btnnormal():self.btnforbidden()
       }, onError: nil, onCompleted: nil, onDisposed: nil).disposed(by: disposeBag)
       btnlogin.rx.tap
           .subscribe(onNext: { [weak self] _ in
               
             //去登录
               
               
        })
      .disposed(by: disposeBag)

登录的验证操作是些很繁杂的事情.rxcocoa 帮我们在ui上的好多东西构建了好了,如rx.text等等,bind 时将一个序列链接上另一个序列,a 返回的结果可以作为b的一个序列,如当我们希望邮箱合法时,让textfield文本框做一些变化,传统上我们都直接各种代理实现,回调函数中处理让textfiled 做变化。
有了rxcocoa 可以

import  Rxswift
import  Rxcocoa
let   phonevalid = txtphone.rx.text.orEmpty.map { $0.characters.count == 11  }.share(replay: 1)
extension  UITextField{
    var showview:AnyObserver{
        return Binder(self) { textfield, valid in
            
            textfield.backgroundColor =  UIColor.red
            
            }.asObserver()
    }
    
}
phonevalid
            .bind(to: passwordOutlet.rx.isEnabled)
            .disposed(by: disposeBag)
 everthingvalid.subscribe({ (ok) in
            
            ok ?  去登:验证不通过
       })

你可能感兴趣的:(Rxswift入坑系列(2))