- 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<Bool>{
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 ? 去登:验证不通过
})