最近在重寫(xiě)的項(xiàng)目中使用了RXSwift翻屈,下面使用一個(gè)登陸的界面來(lái)說(shuō)明一下RXSwift的使用過(guò)程
-
創(chuàng)建如下一個(gè)界面
登陸界面
-
創(chuàng)建viewmodel類(lèi)笨农,初始化方法
init(phoneNum: Observable<String>,
pwdNum: Observable<String>,
loginTap: Observable<Void>) {
//判斷手機(jī)號(hào)碼框輸入是否正確
phoneEnable = phoneNum.map({ (phone) in
return phone.length == 11
}).shareReplay(1)
//判斷 密碼框輸入是否合法
pwdEnable = pwdNum.map({ (pwd) in
return pwd.length >= 6
}).shareReplay(1)
//登陸按鈕是否可以點(diǎn)擊
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)
//登陸的結(jié)果
loginResult = loginTap.withLatestFrom(phoneAndPwd).flatMap({ (phone, pwd) in
//ALTools自己封裝的一個(gè)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,進(jìn)行綁定
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
//手機(jī)號(hào)碼是否合法的一些操作
...
}).addDisposableTo(disposeBag)
viewModel. pwdEnable(onNext: { (result) in
//密碼是否合法的一些操作
...
}).addDisposableTo(disposeBag)
viewModel.loginEnable.subscribe(onNext: { (result) in
//登陸按鈕是否可以點(diǎn)擊的一些操作
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: "學(xué)校:\(user.schID!),用戶:\(user.userName!)")
let controller = HomeViewController()
self.navigationController?.pushViewController(controller, animated: true)
}
}).addDisposableTo(disposeBag)
下一節(jié):RxSwift+MJRefresh+Realm實(shí)現(xiàn)tableView的刷新(分頁(yè))