https://github.com/pircate/rxswiftdemo
RxSwift Demo
https://github.com/pircate/rxswiftdemo
mvvm rxswift
Last synced: about 1 year ago
JSON representation
RxSwift Demo
- Host: GitHub
- URL: https://github.com/pircate/rxswiftdemo
- Owner: Pircate
- Created: 2018-05-18T08:50:39.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2021-09-02T02:23:06.000Z (almost 5 years ago)
- Last Synced: 2025-03-31T04:51:11.160Z (over 1 year ago)
- Topics: mvvm, rxswift
- Language: Swift
- Homepage:
- Size: 7.58 MB
- Stars: 21
- Watchers: 1
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# LightCloud
RxSwift 登录/注册/搜索/编辑/网络 Demo
## ViewModel
```swift
final class LoginViewModel {
struct Input {
let username: Observable
let password: Observable
let captchaTap: ControlEvent
let loginTap: ControlEvent
}
struct Output {
let isEnabled: Driver
let captcha: Driver<(title: String, isEnabled: Bool)>
let login: Driver
let state: Driver
}
}
extension LoginViewModel: ViewModelType {
func transform(_ input: LoginViewModel.Input) -> LoginViewModel.Output {
let isEnabled = input.verifyloginButton()
let state = State()
let captcha = input.requestLoginCaptcha(state)
let login = input.requestLogin(state)
return Output(isEnabled: isEnabled,
captcha: captcha,
login: login,
state: state.asDriver(onErrorJustReturn: .idle))
}
}
fileprivate extension LoginViewModel.Input {
func verifyloginButton() -> Driver {
return Observable
.combineLatest(username.isEmpty, password.isEmpty) { !$0 && !$1 }
.asDriver(onErrorJustReturn: false)
}
func requestLoginCaptcha(_ state: State) -> Driver<(title: String, isEnabled: Bool)> {
return captchaTap.withLatestFrom(username)
.flatMap{
LCUser.rx.requestLoginCaptcha(mobile: $0)
.trackState(state, success: "验证码已发送")
.catchErrorJustComplete()
}
.flatMap(to: 60.countdown())
.asDriver(onErrorJustReturn: (title: "重新发送", isEnabled: true))
}
func requestLogin(_ state: State) -> Driver {
let usernameAndPassword = Observable
.combineLatest(username, password) { (username: $0, password: $1) }
return loginTap.withLatestFrom(usernameAndPassword)
.flatMap {
LCUser.rx.login(mobile: $0.username, captcha: $0.password)
.trackState(state, success: "登录成功")
.catchErrorJustComplete()
}
.map(to: true)
.asDriver(onErrorJustReturn: false)
}
}
```